opengl-es - 多个 IBO --> IBO

标签 opengl-es opengl-es-2.0 webgl

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

请让我知道我在这里缺少什么....

最佳答案

GL_ELEMENT_ARRAY_BUFFER 绑定(bind)与GL_ARRAY_BUFFER 绑定(bind)无关,每个绑定(bind)由一组不同的命令使用。这就是为什么人们不应该在一开始就使用多个 VBO 来学习 OpenGL,交错的 VBO 避免了这种混淆。我将在下面尝试消除您的困惑。

GL_ARRAY_BUFFER 绑定(bind)用于像 glVertexAttribPointer (...) 这样的命令。另一方面,GL_ELEMENT_ARRAY_BUFFER 绑定(bind)由 glDrawElements (...) 实现。

IBO 中的索引本身 均未指向元素数组。他们指的是什么 glVertexAttribPointer (...) 是您在绑定(bind) GL_ARRAY_BUFFER 时设置的。


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

关于opengl-es - 多个 IBO --> IBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342409/

相关文章:

iphone - 在 iOS 上的 OpenGL ES 着色器中混合多个纹理会导致相反的行为

Android:在 SurfaceView 和 OpenGL 之间做出选择(GLSurfaceView)

android - 绘图 GL_POINTS

android - OpenGL 着色器无法在设备上编译

ios - 在 iOS 上创建和更新 OpenGLES 纹理

ios - 是否可以通过 iOS 纹理缓存 API 从 OpenGL ES 帧缓冲区读取 float ?

three.js - 来自 uv 偏移的 GLSL webgl lerp 法线

三.Js在webgl中绘制线性渐变纹理

javascript - THREE.js 代码仅在存在断点时运行

android - 检查是否执行了 MotionEvent.ACTION_MOVE