使用 glDrawElements (iOS) 重用相同的缓冲区

Posted

技术标签:

【中文标题】使用 glDrawElements (iOS) 重用相同的缓冲区【英文标题】:Reusing same buffer with glDrawElements (iOS) 【发布时间】:2013-03-07 05:57:40 【问题描述】:

是否可以创建一个 VBO 并在同一渲染周期中对 glDrawElements 的调用之间重用它? (我尝试并获得了奇怪的结果)。下面的示例缺少绑定等。

初始化代码(只执行一次) *:*

glGenBuffers(...)

glBufferData(...)

渲染帧代码(每帧执行):

glMapBufferOES(...)
//... Update buffer from index 0 to X
glDrawElements(...)
//... Update buffer from index 0 to Y
glDrawElements(...)
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

【问题讨论】:

【参考方案1】:

您需要在绘制缓冲区之前取消映射。如果您不取消映射,这可能就是您使用 glDrawElements 看到奇怪结果的原因。

http://www.opengl.org/sdk/docs/man/xhtml/glMapBuffer.xml

在调用glDrawElements 后,您可以重新映射缓冲区并再次填充。

如果不立即重用缓冲区,您可能会获得更好的性能。抽签后立即重新映射可能会阻塞,直到抽签完成。

【讨论】:

确实,我怎么能错过。非常感谢!

以上是关于使用 glDrawElements (iOS) 重用相同的缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

使用 glDrawElements 很难理解索引

我不明白的 glDrawElements 的使用

OpenGL:glDrawElements 不绘制

使用 glDrawElements 绘制 std::vector

为啥 glBufferSubData 需要等到 glDrawElements 不使用 VBO?

OpenGL - 使用 glDrawElements 错误地映射纹理