Opengl es 多个VBO-->;伊博
我只是想了解VBO和IBO如何在WEBGL中工作。 以下是我的理解: IBO有助于减少传递给GPU的信息量。所以我们有一个VBO,然后我们创建一个IBO,它的索引指向VBO。我怀疑WEBGL是如何知道IBO VBO映射的。对于单个VBO/IBO,我认为GL是一个状态机,它会看到绑定到的最后一个数组缓冲区,然后将该缓冲区用作IBO目标。下面是多个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
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
,因为这是管道知道哪些顶点在哪里的方式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
)表示(值得检查)