问题描述
我最近从使用 glBufferData
切换到 glMapBufferRange
,这让我可以直接访问 GPU 内存,而不是每帧都将数据从 cpu 复制到 GPU。
这很好用,在 OpenGL ES 3.0 中我每帧执行以下操作:
但一些 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
,例如在 GLES31
或 GLES31Ext
中,我只是不确定如何继续。
解决方法
OpenGL ES 的标准 Android Java 绑定仅公开保证受 Android 上所有实现支持的扩展。如果您想公开不那么普遍可用的供应商扩展,您需要推出自己的 JNI 绑定,使用来自 NDK 编译的本机代码的 eglGetProcAddress()
来获取入口点。
对于这个,您需要扩展入口点 glBufferStorageEXT()
。