android - 如何在 Android 上的 OpenGL ES 3.1 中使用 GL_MAP_PERSISTENT_BIT?
问题描述
我最近从 using 切换glBufferData
到glMapBufferRange
which 让我可以直接访问 GPU 内存,而不是每帧都将数据从 CPU 复制到 GPU。
这工作得很好,在 OpenGL ES 3.0中我每帧执行以下操作:
- 通过 .获取指向我的 GPU 缓冲内存的指针
glMapBufferRange
。 - 使用此指针直接更新我的缓冲区。
- 用于
glUnmapBuffer
取消映射缓冲区以便我可以渲染。
但是某些 Android 设备可能至少具有 OpenGL ES 3.1,并且据我所知,可能还具有EXT_buffer_storage扩展名(如果这是错误的扩展名,请纠正我?)。使用此扩展,可以设置不需要使用标志映射/取消映射每个帧的持久缓冲区指针。GL_MAP_PERSISTENT_BIT
但是我无法弄清楚或在网上找到很多如何访问这些功能的方法。
我如何在 Android 上的 OpenGL ES 3.1 中glMapBufferRange
使用set 调用?GL_MAP_PERSISTENT_BIT
检查glGetString(GL_EXTENSIONS)
似乎确实显示扩展程序存在于我的设备上,但我似乎无法找到GL_MAP_PERSISTENT_BIT
某个地方,例如在GLES31
orGLES31Ext
中,我只是不确定如何继续。
解决方案
用于 OpenGL ES 的标准 Android Java 绑定只公开保证被 Android 上的所有实现支持的扩展。如果您想公开不太普遍可用的供应商扩展,您需要滚动您自己的 JNI 绑定,使用使用eglGetProcAddress()
NDK 编译的本机代码来获取入口点。
对于这个,您需要扩展入口点glBufferStorageEXT()
。
推荐阅读
- python - 如何根据python中的常见项目对列表项进行分组
- symfony - Symfony 序列化器和多对多设置器
- ios - 当我尝试使用 Apple 登录时,我将 Email 和 FullName 设为 nil 值
- reactjs - 如何在反应中以多步形式将图像src添加到状态
- automated-tests - 线程“主”quickfix.ConfigError 中的异常:FIX44.xml:无法解析数据字典文件
- flutter - Flutter - 如何使用自定义前缀设计制作自定义输入字段?
- azure - 如何下载 Python 中的 Azure Bot 源代码?
- filter - IronPython Spotfire:创建层次结构列并将关联的过滤器移动到 TableGroup.Subgroup
- selenium-webdriver - 使用带有 C#、Nunit 的 Selenium Web 驱动程序进行 PDF 报告
- android - 无法从 Activity 中的 Intent 获取数据