use*_*474 3 c++ opengl buffer vertex glad
我正在尝试创建 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);
Run Code Online (Sandbox Code Playgroud)
它在渲染时引起问题。
如果我像这样修复代码。
// 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);
Run Code Online (Sandbox Code Playgroud)
它按我的预期工作。
我真的不知道为什么不在 VAO 之前绑定 EBO。
索引缓冲区( ELEMENT_ARRAY_BUFFER) 绑定存储在顶点数组对象中中。当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,则该缓冲区将分配给当前绑定的顶点数组对象。