这个特定的VBO将在完全更新之前被使用1到4次,我不确定我必须选择GL_STREAM_DRAW还是GL_DYNAMIC_DRAW。
根据 OpenGL API,您应该使用DYNAMIC_DRAW。
STREAM
当数据存储内容只会被修改一次并且最多使用几次时,请使用STREAM_DRAW。
STATIC
当数据存储内容只会被修改一次并且多次使用时,请使用STATIC_DRAW。
DYNAMIC
当数据存储内容将被重复修改并且多次使用时,请使用DYNAMIC_DRAW。
请确保使用glBufferSubData()更新VBO。
GL_STREAM_DRAW
,因为对我来说1到4次就是“几次”了… - lvella使用标志是一个提示,而不是强制性规定。换句话说:如果你使用了“错误”的标志,事情并不会出错。因此我建议你尝试使用全部三种标志:STATIC_DRAW、STREAM_DRAW和DYNAMIC_DRAW,并选择给你最佳性能的标志——很可能它们会并列第一。
ARB_buffer_storage
扩展第2期的这一节:
这些标志的问题始终是每个实现可能对如何优化使用提示建议的不同路径具有不同的想法,每个应用程序似乎都对这些优化工作方式有不同的期望。2)新标志不直接映射到glBufferData的参数,并且一个标志不能用另一个标志表示。那有关系吗?
大多数应用程序都会错误地使用
usage
,而它们只是提示而已。标志是必须遵循的硬性规则。它们具有不同的目的。这里的想法是允许实现不必对应用程序进行猜测并执行更少的跟踪,同时允许应用程序具有更多的控制权。我们根据BufferStorage定义BufferData,其中包含最自由的允许标志(基本上,任何东西都可以),但仍向实现传递提示,以便它继续对应用程序进行猜测。
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
所得到的结果。我们在这里看到的是上述引用文本中所说的“反复猜测”的一个例子。
所有这些都高度依赖于具体实现。这也是上述GL扩展创建的原因之一——它将使程序员在这些方面拥有更多的控制权。然而,据我所知,这个扩展在OpenGL ES领域中并不可用。
glBufferData()
函数,应使用GL_STREAM_DRAW
- 该函数会完全刷新缓冲区的内容,使OpenGL能够进行优化,例如在旧数据仍在使用时让OpenGL上传新数据:缓冲对象流。GL_STATIC_DRAW
。glBufferSubData()
,则应使用GL_DYNAMIC_DRAW
。对于iOS来说,有关VBO的信息可以在苹果开发者网站这里找到。根据他们的文档,GL_DYNAMIC_DRAW和GL_STREAM_DRAW是等价的
。
但我认为你的解决方案更接近GL_DYNAMIC_DRAW,因为GL_DYNAMIC_DRAW用于需要多次渲染并且内容在渲染循环中发生改变的顶点缓冲区。