这个功能的最终参数是什么?

时间:2014-01-15 23:07:45

标签: java android opengl-es

我已经尝试了几天寻找这个问题的答案了,但实际上并没有在任何地方解释,并且很难做出实验来确定答案。

查看此功能的文档: 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规范应该涵盖的问题,但事实并非如此。

1 个答案:

答案 0 :(得分:3)

GL的v函数在Java等语言中有些难以解释,它不支持指针。在C中,您可以使用它们将所需的所有参数传递给连续的内存块。这是一种通过数组传递参数的简单方法。

由于使用C语言传递地址的灵活性,C语言绑定只需要一个参数来表示任意内存位置。为了复制在数组中选择任意位置以复制数据的能力,Java中需要offset

glBufferData (...)有一个类似的构造,它使用java.nio.Buffer的“当前”位置来标记开头。这就是为什么你必须通过重复调用flip (...)来填充put (...)缓冲区的原因 - 它将当前位置移回缓冲区的开头。

事实上,GLES20.glUniformMatrix4fv (...)(使用FloatBuffer的那个)的其他重载的工作方式与glBufferData (...)完全相同。