【问题标题】:Render different VAOs渲染不同的 VAO
【发布时间】:2015-08-07 08:14:41
【问题描述】:

我正在学习和使用 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, )

对于我使用的绘图 glDrawArrays()

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

【问题讨论】:

  • 你能说明你是如何调用 glDrawArrays() 的吗?可能是您传递的尺寸太大,导致缓冲区溢出。
  • 谢谢,这就是答案。我传递了浮点数而不是顶点数。非常感谢:)

标签: java opengl lwjgl vbo vao


【解决方案1】:

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

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


原帖

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

您可以使用它来启用它

glEnable(GL_DEPTH_TEST);

在初始化期间。

【讨论】:

  • 但是我只在一块上调用draw方法。其他块根本不应该被渲染。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多