1

我有一个顶点属性数组GLfloat *vxData。我已经绑定了正确的索引数据GL_ARRAY_BUFFER和正确的索引数据,并且初始顶点成功渲染。GL_ELEMENT_ARRAY_BUFFERvxData

在每个渲染步骤中,我都会:

glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER, vxDataSize, vxData, GL_STATIC_DRAW);
glDrawElements(...)

在某个阶段,vxData更改大小以容纳更少/更多的顶点,重新创建索引数据以反映这一点,并vxDataSize进行更新。对于在数据发生这种变化后立即进行的渲染,简单地调用上面的相同行是否正确?

我知道其他可能性,例如使用glMapBufferOES,我只是想知道以上在这种情况下在技术上是否正确。

4

1 回答 1

5

这是对的吗?是的,您可以这样做,并且您应该获得呈现您期望的功能代码。好吗?_

不。

首先,您在对 OpenGL 实现撒谎。你告诉它你正在制作静态数据。STATIC 意味着你上传一次。如果您每帧都这样做,那么您应该使用 STREAM,而不是 STATIC。

其次,你不应该让缓冲区越来越小。刷新旧数据是一回事,但如果你告诉 OpenGL 缓冲区需要更大,那么它必须实际分配内存。这不好。选择一个尺寸并坚持下去。选择您可以预期使用的最大尺寸并留在那里。

于 2011-09-04T20:06:52.473 回答