Должен ли я использовать один и тот же VBO для передачи разных атрибутов вершины? Или я должен использовать 2?
Я знаю glVertexAttribPointer
будет использовать значения из VBO, который был связан, когда он был вызван. Но можете ли вы дважды буферизовать один и тот же объект? Это заменит то, что было в? Или вы можете очистить буфер? Я не знаю, правильный ли этот подход:
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO); // shared VBO
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(posLoc);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0);
glBufferData(GL_ARRAY_BUFFER, sizeof(colours), colours, GL_STATIC_DRAW);
glEnableVertexAttribArray(colLoc);
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat),(GLvoid*)0);
glBindBuffer(GL_ARRAY_VERTEX, 0);
glBindVertexArray(0);
Или, если я должен использовать 2 VBO для буферизации данных. Что произойдет, если вы позвоните glBufferData
функционировать дважды в одном и том же связанном объекте массива вершин? Это другой способ, которым я мог бы придумать для этого:
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO1); // VBO for vertices
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(posLoc);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0);
glBindBuffer(GL_ARRAY_BUFFER, VBO2); // VBO for colours
glBufferData(GL_ARRAY_BUFFER, sizeof(colours), colours, GL_STATIC_DRAW);
glEnableVertexAttribArray(colLoc);
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat),(GLvoid*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
1 ответ
Верхний пример не будет работать, так как второй вызов glBufferData перезапишет все пространство буфера во втором. Чтобы правильно сделать это, вы должны правильно использовать аргументы шага и указателя, чтобы данные чередовались. Проще (и чище imo) просто иметь несколько VBO, каждый из которых хранит отдельный набор данных.