多个VBO - > IBO

时间:2013-12-03 03:37:01

标签: opengl-es opengl-es-2.0 webgl

我只是想了解VBO和IBO如何在WEBGL中工作。 这是我的理解: IBO有助于减少传递给GPU的信息量。所以我们有一个VBO,然后我们创建一个IBO,其索引指向VBO。我怀疑WEBGL如何知道IBO< - > VBO映射。在单个VBO / IBO的情况下,我认为GL是状态机,它看到它绑定的最后一个ARRAY_BUFFER然后使用该缓冲区作为IBO目标.Below是具有多个VBO(位置缓冲区和颜色缓冲区)的情况如下所示:

    gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexPositionBuffer);
    gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, cubeVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);

    gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexColorBuffer);
    gl.vertexAttribPointer(shaderProgram.vertexColorAttribute, cubeVertexColorBuffer.itemSize, gl.FLOAT, false, 0, 0);

    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);
    setMatrixUniforms();
    gl.drawElements(gl.TRIANGLES, cubeVertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);

在上面的代码中(我从教程中得到它),我们有两个VBO和一个IBO(cubeVertexIndexBuffer),我不明白的是WEBGL如何知道IBO指向位置缓冲区的索引而不是颜色缓冲区(尽管颜色缓冲区是最后一个绑定的ARRAY_BUFFER)。

请告诉我这里缺少的东西......

2 个答案:

答案 0 :(得分:4)

GL_ELEMENT_ARRAY_BUFFER 绑定与 GL_ARRAY_BUFFER 绑定无关,每个绑定由不同的命令集使用。这就是为什么人们不应该在开始时使用多个VBO学习OpenGL,交错的VBO避免了这种混乱。我将尝试在下面澄清您的困惑。

GL_ARRAY_BUFFER 绑定用于glVertexAttribPointer (...)等命令。另一方面, GL_ELEMENT_ARRAY_BUFFER 绑定glDrawElements (...)

IBO中的索引指向 per-se 元素数组。他们指出了什么 是您在设置 GL_ARRAY_BUFFER 时设置的glVertexAttribPointer (...)

<小时/> 如果还不是很明显,那么在任何给定时间都不能有多个相同类型的缓冲区对象。设置attrib指针并且不使用交错数组时,必须更改绑定的VBO。因此,glDrawElements (...)无关心哪个VBO被绑定,它只关心你设置的顶点属性指针和绑定元素数组。这些指针与设置它们时绑定的VBO相关,但是在设置指针后,绑定的状态不再相关。

答案 1 :(得分:0)

OpenGL中的状态非常糟糕。如果你想使用任何缓冲区,你几乎总是需要两个调用:一个告诉OpenGL你想要使用哪个缓冲区,另一个告诉OpenGL操作缓冲区的第二个(以及第三个和更多)。模糊的缓冲区名称使整个事情更加混乱。所以,让我们快速澄清一些事情:

  1. 正如here所述,绑定到gl.ARRAY_BUFFER(或GL_ARRAY_BUFFER)表示指定的缓冲区为VBO
  2. gl.ELEMENT_ARRAY_BUFFER(或GL_ELEMENT_ARRAY_BUFFER)表示IBOthat link值得一试)。 IBO代表一个完整的表面。它是由此曲面构成的所有顶点的索引列表。在绘制调用之前,IBO需要绑定到gl.ELEMENT_ARRAY_BUFFER,因为这就是管道知道哪些顶点在哪里。
  3. 由于您有时需要每个顶点有多个属性(由于某种原因)可能需要存储在不同的缓冲区中,因此您可以使用单个IBO索引到多个VBO。
  4. 最后,(我认为,这是你的困惑),vertexAttribPointer告诉着色器在{{1}时绑定的VBO中的给定相对偏移量中查找给定类型的给定属性} 叫做。这样,管道可以获得每个属性,一旦它具有正确的顶点索引,它从IBO读取。在您的情况下,vertexAttribPointer表示vertexAttribPointer来自vertexPositionAttribute,颜色来自您的颜色缓冲区。为了避免在每次绘制调用之前调用cubeVertexPositionBuffer,您可以使用VAO来缓存该信息。