gpt4 book ai didi

c++ - 为什么 VAO 可以在不绑定(bind)的情况下使用 VBO 数据?

转载 作者:行者123 更新时间:2023-11-30 03:15:54 24 4
gpt4 key购买 nike

为什么VAO不用绑定(bind)就可以使用VBO数据?

https://learnopengl.com/Advanced-OpenGL/Instancing我从这个网页上找到它。代码页: https://learnopengl.com/code_viewer_gh.php?code=src/4.advanced_opengl/10.3.asteroids_instanced/asteroids_instanced.cpp

    unsigned int buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, amount * sizeof(glm::mat4), &modelMatrices[0], GL_STATIC_DRAW);


for (unsigned int i = 0; i < rock.meshes.size(); i++)
{
unsigned int VAO = rock.meshes[i].VAO;
glBindVertexArray(VAO);
// set attribute pointers for matrix (4 times vec4)
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)0);
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)(sizeof(glm::vec4)));
glEnableVertexAttribArray(5);
glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)(2 * sizeof(glm::vec4)));
glEnableVertexAttribArray(6);
glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)(3 * sizeof(glm::vec4)));

glVertexAttribDivisor(3, 1);
glVertexAttribDivisor(4, 1);
glVertexAttribDivisor(5, 1);
glVertexAttribDivisor(6, 1);

glBindVertexArray(0);
}

rock.meshes[i].VAO不用bind就可以使用buffer数据吗?我觉得应该是这样的:

   for (unsigned int i = 0; i < rock.meshes.size(); i++)
{
unsigned int VAO = rock.meshes[i].VAO;
GLuint buffer;
glBindVertexArray(VAO);
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, amount * sizeof(glm::mat4), &modelMatrices[0], GL_STATIC_DRAW);
......
}

最佳答案

不,buffer 仍然绑定(bind)到目标 GL_ARRAY_BUFFER
OpenGL 是一个状态引擎,将缓冲区对象绑定(bind)到目标 GL_ARRAY_BUFFER 的最后一条指令是:

glBindBuffer(GL_ARRAY_BUFFER, buffer); 

因此,当您定义通用顶点属性数据时,buffer 仍然是绑定(bind)的。

当指定通用顶点属性数据数组时(glVertexAttribPointer),则顶点说明(索引、元组大小、格式、步幅、偏移量...)和“名称”绑定(bind)到目标 GL_ARRAY_BUFFER 的当前缓冲区对象设置为 Vertex Array Objects状态 vector 。
参见 Vertex Buffer Object .

注意,一个 Index buffer将直接在顶点数组对象中说明。因此,必须先绑定(bind)顶点数组对象,然后再将缓冲区绑定(bind)到目标 GL_ELEMENT_ARRAY_BUFFER

将缓冲区对象绑定(bind)到目标 GL_ARRAY_BUFFER 不会更改当前顶点数组对象的状态,但将缓冲区对象绑定(bind)到目标 GL_ELEMENT_ARRAY_BUFFER 修改 VAO 状态。

一个顶点数组对象只能引用一个索引缓冲区,但它可以为每个属性引用一个单独的数组缓冲区。

关于c++ - 为什么 VAO 可以在不绑定(bind)的情况下使用 VBO 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56682313/

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