我的问题似乎很简单,但我就是不明白背后的原因:
- 我有一个用 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
,和是正确的值(以字节为单位:))) 并且是网格中索引/顶点的数量(要渲染)。startOffsetInBytes
numBytesToCopy
startIndexOffsetInBytes
indicesNum
一个可疑的地方是设置顶点/法线/texcoord 指针——它们只设置一次——并设置到 VBO 的开头。也许我需要在每次调用 glDrawElements 之前设置它们?