我只是想了解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)。
请告诉我这里缺少的东西......
答案 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 (...)
。
glDrawElements (...)
无关心哪个VBO被绑定,它只关心你设置的顶点属性指针和绑定元素数组。这些指针与设置它们时绑定的VBO相关,但是在设置指针后,绑定的状态不再相关。
答案 1 :(得分:0)
OpenGL中的状态非常糟糕。如果你想使用任何缓冲区,你几乎总是需要两个调用:一个告诉OpenGL你想要使用哪个缓冲区,另一个告诉OpenGL操作缓冲区的第二个(以及第三个和更多)。模糊的缓冲区名称使整个事情更加混乱。所以,让我们快速澄清一些事情:
gl.ARRAY_BUFFER
(或GL_ARRAY_BUFFER
)表示指定的缓冲区为VBO。gl.ELEMENT_ARRAY_BUFFER
(或GL_ELEMENT_ARRAY_BUFFER
)表示IBO(that link值得一试)。 IBO代表一个完整的表面。它是由此曲面构成的所有顶点的索引列表。在绘制调用之前,IBO
需要绑定到gl.ELEMENT_ARRAY_BUFFER
,因为这就是管道知道哪些顶点在哪里。vertexAttribPointer
告诉着色器在{{1}时绑定的VBO中的给定相对偏移量中查找给定类型的给定属性} 叫做。这样,管道可以获得每个属性,一旦它具有正确的顶点索引,它从IBO读取。在您的情况下,vertexAttribPointer
表示vertexAttribPointer
来自vertexPositionAttribute
,颜色来自您的颜色缓冲区。为了避免在每次绘制调用之前调用cubeVertexPositionBuffer
,您可以使用VAO
来缓存该信息。