渲染不同的VAO

时间:2015-08-07 08:14:42

标签: java opengl lwjgl vbo vao

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

问题是,如果我渲染第一个块,则所有以下3个块将在其上呈现。 如果我渲染第二个块,则下面的2个块将呈现在顶部。

这是我的应用程序的日志,描述了我如何设置我的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,)

对于我使用的绘图 (4,8)

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

1 个答案:

答案 0 :(得分:1)

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

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

原帖

似乎您已禁用深度测试,这是一种丢弃远离现有碎片的技术,以防止更远的物体覆盖更近的碎片。

您可以使用

启用它
glEnable(GL_DEPTH_TEST);

在初始化期间。