OpenGL ES:glBufferSubData将网格填充到VBO / IBO中,然后glDrawElements只渲染第一个网格而不是所有网格

时间:2011-01-01 21:31:57

标签: opengl-es indexing offset vbo

我的问题似乎很简单,但我无法理解其背后的原因:

  • 我有一个顶点和一个索引缓冲区,用glBufferSubData填充。有一些网格被逐个填入这个大型VBO及其相应的IBO
  • 然后我尝试用glDrawElements逐个渲染那些小网格

问题是,只有第一个网格被渲染 - 并且多次 - 在每个不同网格应该出现的地方!

以下信息可能有用:

我以这种方式创建VBO

gl.glGenBuffers(1, buffers_, 0);
gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, buffers_[0]);
gl.glBufferData(GL11.GL_ARRAY_BUFFER, sizeInBytes, null, GL11.GL_DYNAMIC_DRAW);

然后将每个网格填充到VBO中,就像这样

gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, name);
gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, startOffsetInBytes, numBytesToCopy, nioBuffer);

网格在这个时代呈现

  • 绑定VBO / IBO并设置适当的客户端状态
  • 然后设置vertex,normal和texcoord“指针” - 它们指向VBO的开头加上它们在顶点“结构”中的偏移量
  • 并致电gl.glDrawElements(GL10.GL_TRIANGLES, indicesNum, GL10.GL_UNSIGNED_SHORT, startIndexOffsetInBytes);
  • 最后,取消绑定VBO / IBO并禁用客户端状态

我调试了代码,我确信sizeInBytesstartOffsetInBytesnumBytesToCopystartIndexOffsetInBytes是正确的值(以字节为单位:)))和{{1是网格中的索引/顶点数(要渲染)。

一个可疑的地方是设置顶点/普通/ texcoord指针 - 它们只设置一次 - 并设置为VBO的开头。也许我需要在每次调用glDrawElements之前设置它们?

1 个答案:

答案 0 :(得分:1)

:D找到了原因。我描述的一切都是正确的。问题是网格被添加到VBO / IBO的方式 - 每个新网格的索引从0重新启动!!因此,只有VBO中的第一个网格被渲染。