Должен ли я использовать один и тот же 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, каждый из которых хранит отдельный набор данных.

Другие вопросы по тегам