Связывают ли VAO массивы индексов автоматически?

Я видел много программ, делающих это на этапе инициализации (псевдокод):

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, чтобы я мог отменить привязку vao после инициализации vbo для индексов (и вообще избежать привязки vbo для индексов на этапе рисования)?


person Dean    schedule 05.05.2017    source источник


Ответы (1)


Да, VAO хранит привязку GL_ELEMENT_ARRAY_BUFFER.

Но обратите внимание, что он всегда сохраняет последнее состояние перед отвязкой VAO. Поэтому, если вы вызовете glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); перед отвязкой VOA, привязка будет удалена. В вашем случае вы также отвязываете 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
person BDL    schedule 05.05.2017
comment
о, интересно. И то же самое не относится к неиндексным VBO, верно? Я вижу, что вы отменяете привязку VBO до отвязки VAO. - person Dean; 05.05.2017
comment
Это связано с тем, что привязки GL_ARRAY_BUFFER (в основном) устанавливаются вызовом glVertexAttribPointer. - person BDL; 05.05.2017
comment
Спасибо. Это было не так просто понять из документации хроноса. - person Dean; 05.05.2017