1

我的问题似乎很简单,但我就是不明白背后的原因:

  • 我有一个用 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 并设置适当的客户端状态
  • 然后设置顶点、法线和 texcoord“指针”——它们指向 VBO 的开头加上它们在顶点“结构”中的偏移量
  • 并打电话gl.glDrawElements(GL10.GL_TRIANGLES, indicesNum, GL10.GL_UNSIGNED_SHORT, startIndexOffsetInBytes);
  • 最后,取消绑定 VBO/IBO 并禁用客户端状态

我调试了代码,我确定sizeInBytes,和是正确的值(以字节为单位:))) 并且是网格中索引/顶点的数量(要渲染)。startOffsetInBytesnumBytesToCopystartIndexOffsetInBytesindicesNum

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

4

1 回答 1

1

:D 找到了那个原因。我描述的一切确实是正确的。问题在于将网格添加到 VBO/IBO 中的方式 - 每个新网格的索引都从 0 重新开始!!所以只有 VBO 中的第一个网格被渲染。

于 2011-01-02T08:58:44.403 回答