【发布时间】:2022-01-10 19:53:30
【问题描述】:
我有一个顶点缓冲区对象 (VBO),我通常使用它(通过适当的 VAO)通过两次调用 glDrawArrays(一个使用 GL_POINTS,一个使用 GL_LINE_STRIP)在它们之间绘制带有线的点。
现在我有兴趣放弃 GL_LINE_STRIP 并通过定义索引缓冲区对象 (IBO) 并使用 glDrawElements 在 VBO 中的特定索引之间画线。
但是,当我创建一个 VBO 然后创建并填充 IBO 时,我对 glDrawArrays(GL_POINTS,...) 的调用什么也不做!如果我简单地注释掉调用glBufferData(GL_ELEMENT_ARRAY_BUFFER,...) 的行,glDrawArrays 调用将再次起作用。我假设 glDrawArrays 调用会简单地忽略添加 IBO,但显然不是。
那么,是否可以使用一个 VBO 来使用 glDrawArrays 和(通过 IBO)glDrawElements 进行渲染?
对我来说有点困惑的是 IBO 如何链接到 VBO 和/或 VAO 以及因此链接到当前的绘制命令。例如,是否可以使用一个 VBO,然后为不同的glDrawElements 调用绑定到两个不同的 IBO? (例如,如果我想绘制索引为 0、1、2 和 1、2、3 的三角形怎么办;但我想在索引 0、1 和 1、3 之间画线)。
我在代码中将 IBO 与我的 VAO 连接起来的步骤如下:
- 为 VBO 和 IBO 创建缓冲区 ID
- 绑定并填充 VBO
- 为 VAO 创建 ID
- 绑定 VAO (
glBindVertexArray) 并设置我的属性(使用glEnableVertexAttribArray、glVertexAttribFormat、glVertexAttribBinding和glBindVertexBuffer) - 绑定并填写 IBO
- 取消绑定 VAO (
glBindVertexArray(0))
我是否需要使用其他东西(或不同的操作顺序)将 IBO 与 VAO 关联起来?
谢谢。
编辑 - 我发现我的编码错误:
当我生成缓冲区时,我一次生成了 4 个到单个数组(用于代码中的这个和其他 OpenGL 缓冲区)。但是,当我将 ID 分配给特定的变量名称时,我对 VBO 和 IBO 都使用索引 0(零)(然后对其他缓冲区使用索引 2 和 3)。基本上,我不小心跳过了索引 1,因此在填写 IBO 时覆盖了我的 VBO。正如下面的评论中所指出的,这个练习至少有助于巩固我对如何在 VBO 的背景下使用 IBO 的理解。谢谢。
【问题讨论】:
-
“我认为添加 IBO 会被 glDrawArrays 调用简单地忽略 [...]” - 是的。您的代码中某处存在错误,但如果不查看代码就很难判断。
-
"... 是否可以使用一个 VBO,然后为不同的
glDrawElements调用绑定到两个不同的 IBO?" - 不可以。IBO 存储在顶点数组对象。您只能将一个 IBO 关联到 VAO。但是,您可以创建多个 VAO。见Vertex Specification - Index buffers。 -
@Rabbid76 感谢 cmets。至少我知道它应该可以工作,而且这是我代码中的一个错误。我会看看我是否可以解决这个问题,或者我是否需要解决代码级别的问题。至于 IBO/VAO 连接,我将添加到我的问题中,以说明我如何在代码中尝试这样做,以确保我将 IBO 与我的 VBO 相关联。
-
IBO(参考)存储在 VAO 中。所以需要在IBO之前绑定VAO。
标签: opengl vbo index-buffer