如何在 Android 上的 OpenGL ES 3.1 中使用 GL_MAP_PERSISTENT_BIT?
How do I use GL_MAP_PERSISTENT_BIT in OpenGL ES 3.1 on Android?
我最近从使用 glBufferData
切换到 glMapBufferRange
,这让我可以直接访问 GPU 内存,而不是每帧将数据从 CPU 复制到 GPU。
这在 OpenGL ES 3.0 中工作得很好,我每帧执行以下操作:
- 通过
glMapBufferRange
获取指向我的 GPU 缓冲区内存的指针。
- 使用这个指针直接更新我的缓冲区。
- 使用
glUnmapBuffer
取消映射缓冲区以便我可以渲染。
但某些 Android 设备可能至少具有 OpenGL ES 3.1,据我所知,可能还具有 EXT_buffer_storage 扩展名(如果扩展名有误,请纠正我?)。使用此扩展可以设置 persistent 缓冲区指针,不需要使用 GL_MAP_PERSISTENT_BIT
标志在每一帧中 mapping/unmapping。但是我无法弄清楚或在网上找到很多关于如何访问这些功能的方法。
如何在 Android 上使用 OpenGL ES 3.1 中设置的 GL_MAP_PERSISTENT_BIT
调用 glMapBufferRange
?
检查 glGetString(GL_EXTENSIONS)
似乎显示扩展存在于我的设备上,但我似乎无法在任何地方找到 GL_MAP_PERSISTENT_BIT
,例如在 GLES31
或 GLES31Ext
中,我只是不确定如何继续。
OpenGL ES 的标准 Android Java 绑定仅公开保证受 Android 上所有实现支持的扩展。如果您想公开不太普遍可用的供应商扩展,您需要滚动自己的 JNI 绑定,使用 eglGetProcAddress()
从使用 NDK 编译的本机代码中获取入口点。
对于这个,您需要扩展入口点 glBufferStorageEXT()
。
我最近从使用 glBufferData
切换到 glMapBufferRange
,这让我可以直接访问 GPU 内存,而不是每帧将数据从 CPU 复制到 GPU。
这在 OpenGL ES 3.0 中工作得很好,我每帧执行以下操作:
- 通过
glMapBufferRange
获取指向我的 GPU 缓冲区内存的指针。 - 使用这个指针直接更新我的缓冲区。
- 使用
glUnmapBuffer
取消映射缓冲区以便我可以渲染。
但某些 Android 设备可能至少具有 OpenGL ES 3.1,据我所知,可能还具有 EXT_buffer_storage 扩展名(如果扩展名有误,请纠正我?)。使用此扩展可以设置 persistent 缓冲区指针,不需要使用 GL_MAP_PERSISTENT_BIT
标志在每一帧中 mapping/unmapping。但是我无法弄清楚或在网上找到很多关于如何访问这些功能的方法。
如何在 Android 上使用 OpenGL ES 3.1 中设置的 GL_MAP_PERSISTENT_BIT
调用 glMapBufferRange
?
检查 glGetString(GL_EXTENSIONS)
似乎显示扩展存在于我的设备上,但我似乎无法在任何地方找到 GL_MAP_PERSISTENT_BIT
,例如在 GLES31
或 GLES31Ext
中,我只是不确定如何继续。
OpenGL ES 的标准 Android Java 绑定仅公开保证受 Android 上所有实现支持的扩展。如果您想公开不太普遍可用的供应商扩展,您需要滚动自己的 JNI 绑定,使用 eglGetProcAddress()
从使用 NDK 编译的本机代码中获取入口点。
对于这个,您需要扩展入口点 glBufferStorageEXT()
。