【问题标题】:Do VAOs also automatically bind indices arrays? [duplicate]VAO 是否也会自动绑定索引数组? [复制]
【发布时间】:2017-10-03 19:21:24
【问题描述】:

我见过很多程序在初始化阶段这样做(伪代码):

glGenVertexArrays(vao)
glBindVertexArray(vao)

glGenBuffers(vbo)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(into the vbo)

glVertexAttribPointer(instruct the vao on vbo's memory organization)

glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBO
glBindVertexArray(0); // Unbind VAO

glGenBuffers(vbo for indices)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo for indices)
glBufferData(populate indices vbo)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // Unbind vbo for indices

这是正确的做法吗? VAO 是否还存储对索引 vbo 的引用,以便我可以在索引的 vbo 也初始化后解除绑定 vao(并避免在绘图阶段完全绑定索引的 vbo)?

【问题讨论】:

    标签: c++ opengl graphics vbo vao


    【解决方案1】:

    是的,VAO 确实存储了 GL_ELEMENT_ARRAY_BUFFER 绑定。

    但请注意,它总是存储解除绑定 VAO 之前的最后一个状态。因此,如果您在解除 VOA 绑定之前调用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);,则绑定将被删除。在您的情况下,您还在绑定索引缓冲区之前取消绑定 VAO,因此此处没有存储绑定。

    正确的代码代码如下:

    lGenVertexArrays(vao)
    glBindVertexArray(vao)
    
    glGenBuffers(vbo)
    glBindBuffer(GL_ARRAY_BUFFER, vbo)
    glBufferData(into the vbo)
    
    glVertexAttribPointer(instruct the vao on vbo's memory organization)
    
    glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBO
    
    glGenBuffers(vbo for indices)
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo for indices)
    glBufferData(populate indices vbo)
    
    glBindVertexArray(0); // Unbind VAO
    
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // Unbind vbo for indices
    

    【讨论】:

    • 哦,有趣。对于非指数 VBO 来说,情况并非如此,对吧?我看到您解除绑定 VAO 之前解除了 VBO 的绑定。
    • 这是因为GL_ARRAY_BUFFER 绑定(基本上)是由glVertexAttribPointer 调用建立的。
    • 谢谢。这从 khronos 文档中并不容易理解。
    猜你喜欢
    • 2011-02-20
    • 2017-04-13
    • 2019-06-24
    • 2014-04-29
    • 1970-01-01
    • 2020-02-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多