当前位置: 代码迷 >> java >> 渲染不同的VAO
  详细解决方案

渲染不同的VAO

热度:28   发布时间:2023-07-25 19:43:28.0

我正在使用LWJGL / OpenGL学习和编程。 我想分块渲染我的地图。 为此,我为每个块创建一个VAO和VBO并上传和链接它??们。

问题是,如果我渲染第一个块,那么接下来的所有3个块都将在此之上渲染。 如果我渲染第二个块,则以下两个块将被渲染在顶部。

这是我的应用程序的日志,描述了我如何设置我的VAO:

Chunk: 0 0
Generate VBO: 1
Generate VAO: 1
Bind VAO: 1
Bind VBO: 1
Enable and set VertexAttribPointer
Bufferdata (Buffersize: 36864)
Bind VAO: 0

Chunk: 0 1
Generate VBO: 2
Generate VAO: 2
Bind VAO: 2
Bind VBO: 2
Enable and set VertexAttribPointer
Bufferdata (Buffersize: 1536)
Bind VAO: 0

Chunk: 1 0
Generate VBO: 3
Generate VAO: 3
Bind VAO: 3
Bind VBO: 3
Enable and set VertexAttribPointer
Bufferdata (Buffersize: 1536)
Bind VAO: 0

Chunk: 1 1
Generate VBO: 4
Generate VAO: 4
Bind VAO: 4
Bind VBO: 4
Enable and set VertexAttribPointer
Bufferdata (Buffersize: 64)
Bind VAO: 0

Draw
Bind VAO: 1
Set Unifoms
Draw Arrays

缓冲区大小符合预期。

对于绑定,我使用glBindVertexArray()和glBindBuffer(GL_ARRAY_BUFFER,)

对于绘图,我使用glDrawArrays()

我设置VAO的方式是否错误,或者您需要我的代码来解决我的问题?

使用 ,count参数指定顶点数 ,而不是某些其他函数指定值(浮点数)或字节数。 OpenGL不会检查计数是否超过VBO的容量。 因此,当您指定的计数值大于VBO中的存储空间时,OpenGL将以静默方式从相邻内存中获取值,在这种情况下,相邻内存包含您的其他VBO。

因此,您必须确保传递顶点数,因为浮点数是原来的三倍,因此绘制所有数据而不是仅绘制一个数据块的数据。


原始帖子

似乎您禁用了深度测试,该技术会丢弃比现有片段更远的所有片段,以防止更远的对象覆盖更近的片段。

您可以启用它

glEnable(GL_DEPTH_TEST);

在初始化期间。

  相关解决方案