【问题标题】:OpenGL ES: glBufferSubData fills meshes into VBO/IBO, then glDrawElements renders only the first mesh instead of all of themOpenGL ES:glBufferSubData 将网格填充到 VBO/IBO,然后 glDrawElements 只渲染第一个网格而不是所有网格
【发布时间】:2011-06-02 07:56:05
【问题描述】:

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

  • 我有一个用 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 并禁用客户端状态

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

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

【问题讨论】:

    标签: opengl-es indexing offset vbo


    【解决方案1】:

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

    【讨论】:

    • 我遇到了类似的问题,但我的解决方法不同,我必须确保使用 glVertexAttribPointer 在 VAO 中添加偏移量。否则它只会渲染添加的第一个网格。你的回答给了我一个暗示,所以我很感谢你:)
    猜你喜欢
    • 2021-10-30
    • 2018-02-11
    • 2016-04-30
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多