为什么有些gl调用接受数组而其他调用只接受Android上的Buffers

时间:2011-01-02 15:13:28

标签: android opengl-es

我刚刚开始在Android上学习OpenGL,我只是注意到一些gl调用,例如glTexCoordPointer(...)或glVertexPointer(...),只接受Buffer对象中的数据,其他如glDrawTexvOES(),glTexParameteriv(),也接受一个float []。

我很好奇为什么会这样? :)

1 个答案:

答案 0 :(得分:2)

基本区别在于glTexCoordPointer和glVertexPointer函数的输入不会立即使用,只有在调用glDraw方法时才使用它们,例如glDrawArrays,glDrawElements。

由于不立即使用数组,因此需要将指向发送到这些函数的数组的指针保持足够长的时间,以便绘制例程访问它。数据必须位于本机堆上,否则垃圾收集器可以移动基础本机指针,即使数据未被删除也是如此。为了在本机堆上获取指针,您需要将数据包装在Buffer对象中。

类似glTexParameteriv的函数使用你传递的数组中的值,因此不必担心指针从被调用函数下面移出,也不需要在本机堆上有它们。

如果您使用glTexCoordPointer和来自本机代码的朋友,则必须保留指向它的指针,直到您调用glDraw函数为止。从本机代码中,您的优势在于指针不需要包装在对象中,但您的缺点是必须手动管理任何堆分配。