2

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

EBO:元素阵列缓冲区对象 VAO:顶点阵列对象

虽然我试图在绑定 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。

4

1 回答 1

4

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

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

于 2021-09-29T19:47:38.930 回答