2011-09-04 62 views
1

我有一个顶点属性数组GLfloat *vxData。我已经将GL_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFERvxData以及正确的索引数据绑定,并且初始顶点成功呈现。OpenGL ES 2.0:使用具有新顶点数据大小的glBufferData

在每个渲染步骤我做的:

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

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

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

回答

5

这是正确的吗?是的,你可以做到这一点,你应该得到可以呈现你期望的功能代码。是好吗

编号

首先,您是在说谎OpenGL实现。你告诉它你正在制作STATIC数据。 STATIC表示你上传到一次。如果你在每一帧都这样做,那么你应该使用STREAM,而不是STATIC。

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

+0

非常感谢这种见解,Nicol。为了实现你的第二个建议,大概我修改'vxDataSize'是一个上限,并简单地为存在的顶点提供索引数据?考虑到'vxData'存储在RAM中并且需要尽可能小,我应该如何处理? – KomodoDave

+0

澄清:我将'vxData'存储在GPU之外,并在每个渲染器上重新提交,因为它包含一些昂贵的值来计算。在RAM中存储可让我使用delta来调整某些值,而无需从头开始重新计算。 – KomodoDave

+2

您是否认为使vxDataSize动态化,使其更大一帧,更小,即使在RAM中也能节省内存?你正在分割你的地址空间。如果您将其设置为固定大小,那么您只会获得一块永远不会移动或调整大小的内存块。如果它的大小可变,那么当你把它放大或缩小时,你必须重新分配它。这可以将它移动到您的地址空间并对其进行分段。不是很好。 –

相关问题