EBO和VAO之间的OpenGL绑定顺序

3
我正在尝试创建OpenGL三角形,但遇到了一些问题。
EBO: ElementArrayBufferObject VAO: VertexArrayObject
当我尝试在绑定VAO之前绑定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之前没有绑定EBO而导致它无法工作。

1个回答

7

索引缓冲区ELEMENT_ARRAY_BUFFER)绑定存储在顶点数组对象中。当调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO)时,元素缓冲对象将存储在当前绑定的顶点数组对象中。因此,在使用glBindVertexArray(VAO)绑定元素缓冲区之前,必须先绑定VAO。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接