opengl es 2 中缺少 glMapBuffer

glMapBuffer is missing from opengl es 2

为什么 opengl es 2.0 中缺少 glMapBuffer?谁可以访问缓冲区数据以有效地更改它?只有glBufferSubData才是修改buffer的最佳方式?

您需要分机 GL_OES_mapbuffer。这提供了 glMapBufferOES 和 glUnmapBufferOES。

映射子范围有单独的扩展:GL_EXT_map_buffer_range

glMapBuffer 是 ES 2.0 中的 extension,不是核心规范的一部分。绝大多数设备(所有 iOS 和大多数 Andriod)都提供扩展,但这不是必需的。上传 VBO 数据的唯一核心方式是使用 glBufferDataglBufferSubData.

"best" 传输缓冲区的方式取决于数据访问模式和您所针对的 OpenGL 驱动程序。这是一篇关于在 OpenGL ES 2.0 上的众多选项之间进行选择的好文章:

http://hacksoflife.blogspot.com/2013/04/there-must-be-50-ways-to-draw-your.html

这是一篇关于类似技术的较新文章。从 OpenGL 4.5 开始,持久映射似乎是最先进的:

https://www.opengl.org/wiki/Buffer_Object_Streaming

最后,"Open GL Insights" 一书有一整章讨论这个问题,包含在免费预览版中:

http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-AsynchronousBufferTransfers.pdf