2015-05-06 93 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作爲參數,而不是混淆值。