我正在使用OpenGL ES 2.0,但我认为它也与非ES有关:如何知道在创建VBO时选择什么“用法”?
这个特殊的VBO将在完全更新之前使用1到4次,我不确定是否必须选择GL_STREAM_DRAW或GL_DYNAMIC_DRAW。
那么,根据OpenGL API你应该使用DYNAMIC_DRAW。
流 当数据存储内容被修改一次并且最多使用几次时,您应该使用STREAM_DRAW。
静态的 当数据存储内容被修改一次并多次使用时,请使用STATIC_DRAW。
动态 当数据存储内容被重复修改并多次使用时,请使用DYNAMIC_DRAW。
确保使用glBufferSubData()更新VBO
用法标志是提示,而不是强制执行。换句话说:如果使用“错误”标志,事情就不会破坏。所以我建议你尝试所有3:STATIC_DRAW,STREAM_DRAW和DYNAMIC_DRAW并选择能够提供最佳性能的那个 - 而且它们很可能会打成平手。
除了到目前为止给出的答案,虽然它与GLES没有任何直接关系,但我想从ARB_buffer_storage
扩展的第2期粘贴这一点(与桌面GL 4.4一起介绍):
2)新标志不直接映射到glBufferData的参数,而不能用另一个表示。那有关系吗?
大多数应用程序得到
usage
错误,他们只是提示。标志是必须遵循的硬性和快速规则。他们服务于不同的目的。这里的想法是允许实现不必再次猜测应用程序并执行较少的跟踪,并使应用程序具有更多控制。我们根据BufferStorage定义BufferData,使用最自由的允许标志(基本上,任何东西),但仍然将提示传递给实现,以允许它继续第二次猜测应用程序。
这些标志的问题一直是每个实现可能对如何优化使用提示所建议的不同路径有不同的想法,并且每个应用程序似乎对这些优化如何工作有不同的期望。
Nvidias桌面GL驱动程序将在调试配置文件中打印它为缓冲区对象做出的一些决定,特别是如果它们存储在客户端RAM中或直接存储在GPU上。玩这个时我得到了以下内容:
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) will use VIDEO memory as the source for buffer object operations.
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) has been mapped in HOST memory.
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) stored in VIDEO memory has been updated.
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) will use VIDEO memory as the source for buffer object operations.
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) has been mapped in HOST memory.
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) stored in SYSTEM HEAP memory has been updated.
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) will use SYSTEM HEAP memory as the source for buffer object operations.
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) will use SYSTEM HEAP memory as the source for buffer object operations.
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) has been mapped WRITE_ONLY in SYSTEM HEAP memory (fast).
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) has been mapped WRITE_ONLY in SYSTEM HEAP memory (fast).
Buffer detailed info: Buffer object 5 (bound to GL_PIXEL_UNPACK_BUFFER_ARB, usage hint is GL_STATIC_DRAW) has been mapped WRITE_ONLY in SYSTEM HEAP memory (fast).
我在这里做的是使用PBO将纹理更新流传输到GPU,通过映射缓冲区每帧更新一次。这里的自然选择是使用GL_STREAM_DRAW
,但我指定了GL_STATIC_DRAW
。驱动程序所做的是最初给我一些VRAM支持的缓冲区,并对我做的前两个更新进行I / O映射。但后来,它改变了主意,并使用了一个客户支持的缓冲区 - 如果我首先要求GL_STREAM_DRAW
,那么我会得到完全相同的结果。我们在这里看到的是上面引用文本的second guessing
的一个例子。
所有这些都是高度实现的。这也是上述GL扩展创建的部分原因 - 这将使程序员更多地控制这些事情。但是,据我所知,这个扩展在OpenGL ES领域是不可用的。
对于IOS,有关VBO的信息是苹果开发者网站上的here。根据他们的文件GL_DYNAMIC_DRAW and GL_STREAM_DRAW are equivalent.
但是我认为你的解决方案更接近GL_DYNAMIC_DRAW,因为GL_DYNAMIC_DRAW is for vertex buffers that are rendered many times, and whose contents change during the rendering loop.