Opengl es 多个VBO-->;伊博

Opengl es 多个VBO-->;伊博,opengl-es,opengl-es-2.0,webgl,Opengl Es,Opengl Es 2.0,Webgl,我只是想了解VBO和IBO如何在WEBGL中工作。 以下是我的理解: IBO有助于减少传递给GPU的信息量。所以我们有一个VBO,然后我们创建一个IBO,它的索引指向VBO。我怀疑WEBGL是如何知道IBO VBO映射的。对于单个VBO/IBO,我认为GL是一个状态机,它会看到绑定到的最后一个数组缓冲区,然后将该缓冲区用作IBO目标。下面是多个VBO(位置缓冲区和颜色缓冲区)的情况,如下所示: gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexPositi

我只是想了解VBO和IBO如何在WEBGL中工作。 以下是我的理解: IBO有助于减少传递给GPU的信息量。所以我们有一个VBO,然后我们创建一个IBO,它的索引指向VBO。我怀疑WEBGL是如何知道IBO VBO映射的。对于单个VBO/IBO,我认为GL是一个状态机,它会看到绑定到的最后一个数组缓冲区,然后将该缓冲区用作IBO目标。下面是多个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的索引指向位置缓冲区而不是颜色缓冲区(尽管颜色缓冲区是最后一个绑定的数组\ U缓冲区)


请让我知道我在这里错过了什么

GL\u元素\u数组\u缓冲区绑定与GL\u数组\u缓冲区绑定无关,每个绑定由一组不同的命令使用。这就是为什么人们不应该在一开始就使用多个VBO学习OpenGL,交错的VBO可以避免这种混乱。我将尝试在下面澄清您的困惑

GL\u ARRAY\u BUFFER绑定用于
glvertexattributepointer(…)
等命令。另一方面,GL\u元素\u数组\u缓冲区通过
gldrawerelements(…)
绑定

IBO中的索引本身不指向任何元素数组。他们指的是什么 是您在绑定GL\u数组\u缓冲区时设置的
glvertexattributepointer(…)
s。

如果还不明显,则在任何给定时间都不能绑定多个相同类型的缓冲区对象。当您设置attrib指针并且不使用交错数组时,您必须更改绑定的VBO。因此,
glpaurements(…)
不关心绑定哪个VBO,它只关心您设置的顶点属性指针和绑定的元素数组。这些指针与设置它们时绑定的VBO相关,但在设置指针后,绑定的状态不再相关。

GL\u元素数组缓冲区
绑定与GL\u数组缓冲区绑定无关,每个绑定都由一组不同的命令使用。这就是为什么人们不应该在一开始就使用多个VBO学习OpenGL,交错的VBO可以避免这种混乱。我将尝试在下面澄清您的困惑

GL\u ARRAY\u BUFFER绑定用于
glvertexattributepointer(…)
等命令。另一方面,GL\u元素\u数组\u缓冲区通过
gldrawerelements(…)
绑定

IBO中的索引本身不指向任何元素数组。他们指的是什么 是您在绑定GL\u数组\u缓冲区时设置的
glvertexattributepointer(…)
s。

如果还不明显,则在任何给定时间都不能绑定多个相同类型的缓冲区对象。当您设置attrib指针并且不使用交错数组时,您必须更改绑定的VBO。因此,
glpaurements(…)
不关心绑定哪个VBO,它只关心您设置的顶点属性指针和绑定的元素数组。这些指针与设置VBO时绑定的任何VBO都是相对的,但在设置指针后,绑定的状态不再相关。

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

  • 如上所述,绑定到
    gl.ARRAY\u BUFFER
    (或
    gl\u ARRAY\u BUFFER
    )表示指定的缓冲区是一个缓冲区
  • gl.ELEMENT\u ARRAY\u BUFFER
    (或
    gl\u ELEMENT\u ARRAY\u BUFFER
    )表示(值得签出)。IBO表示一个完整的曲面。它是该曲面由的所有顶点的索引列表。在绘制调用之前,
    IBO
    需要绑定到
    gl.ELEMENT\u ARRAY\u BUFFER
    ,因为这是管道知道哪些顶点在哪里的方式
  • 由于有时每个顶点需要多个属性(出于某种原因)以存储在单独的缓冲区中,因此可以使用单个IBO索引到多个VBO中
  • 最后,(我想,这是您的困惑),
    vertexAttribPointer
    告诉着色器在调用
    vertexAttribPointer
    时绑定的VBO中的给定相对偏移中查找给定类型的给定属性。这样,管道可以在拥有正确的顶点索引(从IBO读取)后获取每个属性。在您的情况下,
    VertexAttribute指针
    表示
    VertexExpositionAttribute
    来自
    cubeVertexPositionBuffer
    ,颜色来自颜色缓冲区。为了避免在每次绘制调用之前调用
    VertexAttributePointer
    ,您可以改为使用缓存该信息

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

  • 如上所述,绑定到
    gl.ARRAY\u BUFFER
    (或
    gl\u ARRAY\u BUFFER
    )表示指定的缓冲区是一个缓冲区
  • gl.ELEMENT\u ARRAY\u BUFFER
    (或
    gl\u ELEMENT\u ARRAY\u BUFFER
    )表示(值得检查)