我正在尝试将一个Android openGL项目转换为Java,并且我在理解内部的问题时遇到了麻烦
GLES20.glUniformMatrix4fv(int location, int count, boolean transpose, float[] value, int offset)
在opengl ES中,我有两个数组,每个数组长度为128个浮点数
float[] jointMatrix;
float[] invBindPoseMatrix;
然后通过这些调用将其发送到着色器
GLES20.glUniformMatrix4fv(jointMatrixHandle, 8, false,DAE.jointMatrix, 0);
GLES20.glUniformMatrix4fv(invBindPoseMatrixHandle, 8, false, DAE.invBindPoseMatrix, 0);
在着色器中,它被收到
uniform mat4 jointMatrix[8]
uniform mat4 invBindPoseMatrix[8]
我的问题是,android是否通过一次调用发送整个128项浮点数组,并自动细分为8个4x4矩阵?偏移量为16. 0-15-31-等。?
答案是:是的。
你可能会过度思考这一点。这真的没有魔力。在大多数语言中,数组的元素按顺序排列在内存中。因此,如果你看一下8个4x4矩阵数组的内存布局,它只是一个8 * 4 * 4 = 128个浮点数的序列。由于声明了数组的类型,它们将以某种方式解释。但就内存布局而言,它与128个浮点数的数组完全相同。
所以计数为8的glUniformMatrix4fv()
为8个矩阵提供了这个内存的内容。因为,如上所述,8个矩阵的数组只是内存中128个浮点数的序列,它消耗128个浮点数,并将它们直接复制到矩阵数组使用的内存中。
使用OpenGL中的矩阵要注意的一个方面是它们以列主要顺序存储。必须按照传递给glUniformMatrix4fv()
的数组中的矩阵元素的顺序考虑这一点。