我正在学习和编程与LWJGL/OpenGL。我想把我的地图分块渲染。为此,我为每个块创建一个VAO和VBO,并上传和链接它们。
问题是,如果我渲染第一个块,那么下面所有的3个块都将在上面渲染。如果我渲染第二块,下面的2块将在顶部渲染。
这是我的应用程序的日志,描述了我如何设置VAOS:
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的方式是错误的,还是你需要我的代码来解决我的问题?
当使用GLDraWarray
时,count参数指定顶点数,而不是像某些其他函数那样指定值(浮点数)或字节数。OpenGL不检查计数是否超过VBO的容量。因此,当您指定的计数值大于VBO中的存储空间时,OpenGL将静默地从相邻内存中取值,在本例中,相邻内存包含您的其他VBO。
所以你必须确保你通过了顶点的数量,因为浮点数是三倍大,绘制你所有的数据,而不是仅仅是一个块的数据。
看起来你禁用了深度测试,这是一种丢弃所有比现有碎片更远的碎片的技术,以防止更远的物体覆盖更近的物体。
您可以使用
glEnable(GL_DEPTH_TEST);
在初始化期间。