gpt4 book ai didi

opengl-es - 多个 IBO --> IBO

转载 作者:行者123 更新时间:2023-12-02 04:43:26 25 4
gpt4 key购买 nike

我只是想了解 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com