从javax.vecmath.Matrix4f创建浮点[]

从javax.vecmath.Matrix4f创建浮点[],java,opengl,Java,Opengl,在传递到glUniformMatrix4fv之前,我应该使用mMVPMatrix的内容填充float[]的顺序是什么 我正在使用javax.vecmath库 初始化变量 Matrix4f mMVPMatrix = new Matrix4f(); Matrix4f mProjectionMatrix; Matrix4f mViewMatrix; 在GLEventListener.init中设置值 在GLEventListener.display中更新 在绘制期间获取对glsl变量的引用 mMVP

在传递到glUniformMatrix4fv之前,我应该使用mMVPMatrix的内容填充float[]的顺序是什么

我正在使用javax.vecmath库

初始化变量

Matrix4f mMVPMatrix = new Matrix4f();
Matrix4f mProjectionMatrix;
Matrix4f mViewMatrix;
在GLEventListener.init中设置值

在GLEventListener.display中更新

在绘制期间获取对glsl变量的引用

mMVPMatrixHandle = gl2.glGetUniformLocation(shaderProgram, "uMVPMatrix");
gl2.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
uMVPMatrix是一个glsl变量

#version 120

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;

void main() {
    gl_Position = uMVPMatrix * vPosition;
}

默认情况下,OpenGL假定矩阵以列主顺序存储。基于,矩阵元素的编号是行主。例如:

m01:第一行的第二个元素

因此,如果m是一个矩阵4f,您可以构建一个浮点数组v,其中元素按列主顺序排列,如下所示:

float[] v = {m.m00, m.m10, m.m20, m.m30,
             m.m01, m.m11, m.m21, m.m31,
             m.m02, m.m12, m.m22, m.m32,
             m.m03, m.m13, m.m23, m.m33};
glUniformMatrix4fv的第三个参数还允许您选择在将矩阵加载到统一矩阵时是否应进行转置。如果您的值是column major,则将使用false。但是,如果出于某种原因,您的值是按行的主要顺序排列的,那么您也可以使用true作为参数,而不是将值混排

#version 120

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;

void main() {
    gl_Position = uMVPMatrix * vPosition;
}
float[] v = {m.m00, m.m10, m.m20, m.m30,
             m.m01, m.m11, m.m21, m.m31,
             m.m02, m.m12, m.m22, m.m32,
             m.m03, m.m13, m.m23, m.m33};