如何在 Android 上的 OpenGL ES 3.1 中使用 GL_MAP_PERSISTENT_BIT?

问题描述

我最近从使用 glBufferData 切换到 glMapBufferRange,这让我可以直接访问 GPU 内存,而不是每帧都将数据从 cpu 复制到 GPU。

这很好用,在 OpenGL ES 3.0 中我每帧执行以下操作:

  • 通过 glMapBufferRange 获取指向我的 GPU 缓冲存储器的指针。
  • 使用这个指针直接更新我的缓冲区。
  • 使用 glunmapBuffer 取消映射缓冲区,以便我可以渲染。

但一些 Android 设备可能至少有 OpenGL ES 3.1,而且据我所知,也可能有 EXT_buffer_storage 扩展名(如果这是错误的扩展名,请纠正我?)。使用此扩展,可以设置持久缓冲区指针,不需要使用 GL_MAP_PERSISTENT_BIT 标志映射/取消映射每一帧。但我无法在网上弄清楚或找到如何访问这些功能方法

我究竟如何在 Android 上的 OpenGL ES 3.1 中使用 glMapBufferRange调用 GL_MAP_PERSISTENT_BIT

检查 glGetString(GL_EXTENSIONS) 似乎确实显示扩展程序存在于我的设备上,但我似乎无法在任何地方找到 GL_MAP_PERSISTENT_BIT,例如在 GLES31GLES31Ext 中,我只是不确定如何继续。

解决方法

OpenGL ES 的标准 Android Java 绑定仅公开保证受 Android 上所有实现支持的扩展。如果您想公开不那么普遍可用的供应商扩展,您需要推出自己的 JNI 绑定,使用来自 NDK 编译的本机代码的 eglGetProcAddress() 来获取入口点。

对于这个,您需要扩展入口点 glBufferStorageEXT()