我已经尝试了几天寻找这个问题的答案了,但实际上并没有在任何地方解释,并且很难做出实验来确定答案。
查看此功能的文档: http://developer.android.com/reference/android/opengl/GLES20.html#glUniformMatrix4fv%28int,%20int,%20boolean,%20float[],%20int%29 非常详尽,对吧?
除了讽刺之外,什么是抵消有利于: glUniformMatrix4fv(int location,int count,boolean transpose,float [] value,int offset)我在想,如果value []适用于例如4个矩阵,即float [4 * 4 * 4]数组,则偏移量决定了将要上传到GPU的16个浮点数。
所以,如果价值是:
{
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0
}
我按这样调用函数:
GLES20.glUniformMatrix4fv(location, 1, false, values, 16);
身份矩阵会在指定的统一位置上传到GPU吗?
我已经浏览了很多,并试图找到源代码以确定是否是这种情况,但唉。 我很抱歉提出一个API规范应该涵盖的问题,但事实并非如此。
答案 0 :(得分:3)
GL的v
函数在Java等语言中有些难以解释,它不支持指针。在C中,您可以使用它们将所需的所有参数传递给连续的内存块。这是一种通过数组传递参数的简单方法。
由于使用C语言传递地址的灵活性,C语言绑定只需要一个参数来表示任意内存位置。为了复制在数组中选择任意位置以复制数据的能力,Java中需要offset
。
glBufferData (...)
有一个类似的构造,它使用java.nio.Buffer
的“当前”位置来标记开头。这就是为什么你必须通过重复调用flip (...)
来填充put (...)
缓冲区的原因 - 它将当前位置移回缓冲区的开头。
事实上,GLES20.glUniformMatrix4fv (...)
(使用FloatBuffer
的那个)的其他重载的工作方式与glBufferData (...)
完全相同。