1

我有一个顶点缓冲区对象 (VBO),我通常使用它(使用适当的 VAO)通过两次调用glDrawArrays(一个使用 GL_POINTS,一个使用 GL_LINE_STRIP)在它们之间绘制带有线的点。

现在我有兴趣放弃 GL_LINE_STRIP 并通过定义索引缓冲区对象 (IBO) 并使用glDrawElements.

但是,当我创建一个 VBO 然后创建并填充 IBO 时,我的调用glDrawArrays(GL_POINTS,...)什么也没做!如果我简单地注释掉调用的行,调用就会glBufferData(GL_ELEMENT_ARRAY_BUFFER,...)再次glDrawArrays起作用。我认为添加 IBO 会被调用忽略glDrawArrays,但显然不是。

那么,是否可以使用一个 VBO 来使用 aglDrawArrays和(通过 IBO)进行渲染glDrawElements

对我来说有点困惑的是 IBO 如何链接到 VBO 和/或 VAO 并因此链接到当前绘制命令。例如,是否可以使用一个 VBO,然后为不同glDrawElement的 s 调用绑定到两个不同的 IBO?(例如,如果我想绘制索引为 0、1、2 和 1、2、3 的三角形怎么办;但我想在索引 0、1 和 1、3 之间画线)。

我在代码中将 IBO 与我的 VAO 连接起来的步骤如下:

  1. 为 VBO 和 IBO 创建缓冲区 ID
  2. 绑定并填充VBO
  3. 为 VAO 创建 ID
  4. 绑定 VAO ( )并glBindVertexArray设置我的属性(使用glEnableVertexAttribArrayglVertexAttribFormat和)glVertexAttribBindingglBindVertexBuffer
  5. 绑定并填写IBO
  6. 解除绑定 VAO ( glBindVertexArray(0))

我还需要使用其他东西(或不同的操作顺序)将 IBO 与 VAO 关联起来吗?

谢谢。


编辑 - 我发现我的编码错误:

当我生成缓冲区时,我一次生成了 4 个到单个数组(用于代码中的这个和其他 OpenGL 缓冲区)。但是,当我将 ID 分配给特定的变量名称时,我对 VBO 和 IBO 都使用索引 0(零)(然后对其他缓冲区使用索引 2 和 3)。基本上,我不小心跳过了索引 1,因此在填写 IBO 时覆盖了我的 VBO。正如下面的评论中所指出的,这个练习至少有助于巩固我对如何在 VBO 的背景下使用 IBO 的理解。谢谢。

4

1 回答 1

1

Index Buffer ( ELEMENT_ARRAY_BUFFER) 绑定存储在顶点数组对象中。当glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO)被调用时,元素缓冲区对象 ID 存储在当前绑定的顶点数组对象中。因此,VAO 必须在元素缓冲区之前与glBindVertexArray(VAO).

Index Buffer相比,Vertex Buffer binding ( ARRAY_BUFFER) 是一个全局状态。
在 VAO 状态向量中陈述的每个属性都可能指代不同的ARRAY_BUFFER. 当glVertexAttribPointer被调用时,当前绑定到目标的缓冲区,ARRAY_BUFFER与指定的属性索引相关联,并且对象的 ID 存储在当前绑定的 VAO 的状态向量中。

于 2021-12-05T13:47:58.680 回答