2015-05-06 94 views
0

在使用glUniformMatrix4fv之前,我应该使用mMVPMatrix的内容填充float[]的哪个顺序?从javax.vecmath.Matrix4f创建一个float []

我正在使用javax.vecmath库。

初始化变量

Matrix4f mMVPMatrix = new Matrix4f(); 
Matrix4f mProjectionMatrix; 
Matrix4f mViewMatrix; 

设定值GLEventListener.init()

mProjectionMatrix = createPerspectiveProjection(60.0f, width/height, 0.1f, 100.0f); // method that returns an object of type `Matrix4f` 
mViewMatrix = new Matrix4f(); 
mViewMatrix.setIdentity(); 

更新的GLEventListener.display()

mMVPMatrix = mProjectionMatrix; 
mMVPMatrix.mul(mViewMatrix); 

得到参考GLSL变量中汲取

mMVPMatrixHandle = gl2.glGetUniformLocation(shaderProgram, "uMVPMatrix"); 
gl2.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0); 

uMVPMatrixglsl可变..

#version 120 

uniform mat4 uMVPMatrix; 
attribute vec4 vPosition; 

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

回答

0

默认情况下,OpenGL的假定矩阵被存储在列优先顺序。基于Matrix4f documentation,矩阵元素的编号是主要行。例如:

m01:第一行的第二个元素。

所以,如果mMatrix4f,你可以建立一个float数组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()的第三个参数,您还可以选择是否矩阵应该换位同时将其装入制服。如果您的值是列专业,您将使用false。但是,如果由于某种原因,您的行数大于您的值,您也可以使用true作为参数,而不是混淆值。