在传递到 glUniformMatrix4fv
之前,我应该使用 mMVPMatrix
的内容填充 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);
uMVPMatrix
是一个 glsl
变量..
#version 120
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main() {
gl_Position = uMVPMatrix * vPosition;
}
最佳答案
默认情况下,OpenGL 假定矩阵按列主序存储。基于Matrix4f documentation ,矩阵元素的编号是行主数。例如:
m01: The second element of the first row.
因此,如果 m
是 Matrix4f
,您可以构建一个 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
作为参数,而不是打乱值。
关于java - 从 javax.vecmath.Matrix4f 创建 float[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089482/