gpt4 book ai didi

c++ - EBO 和 VAO 之间的 OpenGL 绑定(bind)顺序

转载 作者:行者123 更新时间:2023-12-05 01:27:31 31 4
gpt4 key购买 nike

我正在尝试创建 opengl 三角形,但遇到了一些问题。

EBO : 元素数组缓冲区对象VAO:顶点数组对象

当我尝试在绑定(bind) VAO 之前绑定(bind) EBO 时,它导致了错误,我不知道为什么。

我的代码:

// Generate the VAO and VBO with only 1 object each
glGenVertexArrays(1, &VAO);



glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

// Make the VAO the current Vertex Array Object by binding it
glBindVertexArray(VAO);

它在渲染时导致问题。

如果我按照这个顺序修复代码。

// Generate the VAO and VBO with only 1 object each
glGenVertexArrays(1, &VAO);

// Make the VAO the current Vertex Array Object by binding it
glBindVertexArray(VAO);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

它按我预期的那样工作。

我真的不知道为什么不在 VAO 之前绑定(bind) EBO。

最佳答案

index buffer (ELEMENT_ARRAY_BUFFER) 绑定(bind)存储在 Vertex Array Object 中.当 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO) 被调用时,元素缓冲区对象存储在当前绑定(bind)的顶点数组对象中。因此,必须使用 glBindVertexArray(VAO) 在元素缓冲区之前绑定(bind) VAO。

请注意,与 index buffer 相比(ELEMENT_ARRAY_BUFFER),vertex buffer绑定(bind) (ARRAY_BUFFER) 是一个全局状态。
VAO 状态 vector 中声明的每个属性可能引用不同的 ARRAY_BUFFER。此引用存储在 glVertexAttribPointer 时叫做。然后将当前绑定(bind)到目标 ARRAY_BUFFER 的缓冲区关联到指定的属性索引,并将对象的名称(值)存储在当前绑定(bind)的 VAO 的状态 vector 中。
然而,索引缓冲区是 VAO 的一种状态。如果缓冲区绑定(bind)到目标 ELEMENT_ARRAY_BUFFER,则此缓冲区分配给当前绑定(bind)的顶点数组对象。

关于c++ - EBO 和 VAO 之间的 OpenGL 绑定(bind)顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69382389/

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