android - 为什么有些 gl 调用接受数组,而其他的只接受 Android 上的缓冲区

标签 android opengl-es

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

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

最佳答案

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

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

类似 glTexParameteriv 的函数会立即使用您传入的数组中的值,因此无需担心指针从被调用函数下移出,也无需将它们放在 native 堆上。

如果您在 native 代码中使用 glTexCoordPointer 和 friend ,则必须保留发送给它的指针,直到您也调用了 glDraw 函数。在 native 代码中,您的优势在于指针无需包装在对象中,但缺点是您必须手动管理任何堆分配。

关于android - 为什么有些 gl 调用接受数组,而其他的只接受 Android 上的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4578969/

相关文章:

android - 是否可以在 Facebook Android SDK3 中更改 Facebook 登录按钮图像?

javascript - 在 Three.js 中实现 GLSL 着色器时出现问题

ios - 如何使用 Quartz 2D 和 Grand CEntral Dispatch 以编程方式生成 UIImage

android - 在 Android 平板电脑上共享 2 个 GLSurfaceViews 之间的 EGL2.0 上下文导致 EGL_BAD_ACCESS

android - Scaled ModelMatrix 与漫射照明混淆

java - 删除 Multimap 中的重复值

java - 使用 Jackson 反序列化

Android 自定义首选项更改覆盖

Android - 奇怪的错误或我的文件结构有问题?

javascript - 特定方向上经过 3 点的圆弧