2016-12-04 8 views
0

Может ли два VAO (va01, vao2) иметь одинаковый номер индекса атрибута вершины?Может ли другой VAO использовать предыдущий использованный индекс атрибута вершинного кода

GLuint vao1, vao2; 

glGenVertexArrays(1, &vao1); 
glGenVertexArrays(1, &vao2); 

{ 
glBindVertexArray(vao1); 
... 
glBindBuffer(GL_ARRAY_BUFFER, vbo1); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
... 
glBindVertexArray(0); 
} 

{ 
glBindVertexArray(vao2); 
... 
glBindBuffer(GL_ARRAY_BUFFER, vbo2); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
... 
glBindVertexArray(0); 
} 

vbo1 Пусть и vbo2 определены прежде, чем эти кода, и они получили glBufferData уже. Может ли vao1 и vao2 оба имеют одинаковый индекс атрибута вершины 0?

ответ

1

Да, несколько VAO могут устанавливать одни и те же атрибуты вершин, указывая на разные VBOs каждый.

Предположим, что vbo1 и vbo2are определены перед этим кодом, и они получили glBufferDataalready. Могут ли vao1 и vao2 иметь одинаковый индекс атрибута вершины 0?

Вы путаете некоторые вещи здесь. ВАО никогда не заботятся о BufferData. VAO хранят указатели атрибутов, атрибут разрешает и GL_ELEMENT_ARRAY_BUFFER_BINDING. Они делают не хранят любые данные вершин, они ссылаются только на него. И они ссылаются на VBO по имени - это значит, что вы можете просто сделать:

glBindBuffer(GL_ARRAY_BUFFER, vbo1); 
glVertexAttribPointer(i, ...); // here, a reference to vbo1 gets part of the attrib pointer for attrib i 
... 
glBindBuffer(GL_ARRAY_BUFFER, vbo1); 
glBufferData(...); // VAO will now point into this buffer storage 

(это также означает, что вы можете настроить указатель до создания буферной памяти для VBO, вам просто необходимо иметь создал объект VBO). Возможно, вы найдете мою иллюстрацию в this answer полезной.