OpenGL ES 2.0:将glBufferData与新的顶点数据大小一起使用

Kom*_*ave 1 opengl-es vertex opengl-es-2.0

我有一个顶点属性数组GLfloat *vxData.我既结合GL_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFERvxData和正确的索引数据和初始顶点渲染成功.

在每个渲染步骤中,我做:

glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER, vxDataSize, vxData, GL_STATIC_DRAW);
glDrawElements(...)
Run Code Online (Sandbox Code Playgroud)

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

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

Nic*_*las 5

这是对的吗?是的,您可以这样做,您应该获得能够呈现您期望的功能代码.是不是

没有.

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

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

  • 你是否认为使`vxDataSize`动态化,使其更大一帧然后更小一帧,即使在RAM中也可以节省内存?你正在分割你的地址空间.如果你把它设置为固定大小,那么你只需要获得一块从未移动或调整自身大小的内存.如果它的大小可变,那么当你将它变大或变小时,你必须重新分配它.这可以将它移动到您的地址空间并将其分段.这个不好. (2认同)