Я пишу рендер и собираюсь выбрать последний способ управления vao / vbo / shader. В Интернете я нашел очень противоречивую информацию о том, что на самом деле рекомендуется.
Прямо сейчас идея заключается в следующем:
-Один VBO хранит все сетки последовательно.
-В соответствии с «отображением шейдера» создайте VAO для хранения конкретного отображения указателя в VBO. («отображение шейдеров», одинаковое для разных шейдеров с одинаковыми входами)
затем сортируйте сущности путем «отображения шейдеров» и рендеринга с использованием смещений в основном VBO, таким образом сводя к минимуму шейдер и переключатели VAO. Что-то вроде:
for(shaders by mapping)
bindVAO(); //set pointers
for(shader)
for(entity using shader)
entity.setUniforms();
drawArrays(entity.offset, entity.size);
Поскольку это потребовало бы значительного количества рефакторинга, я хотел спросить, является ли это решение оптимальным.
Мне также интересно, возможно ли иметь несколько чередующихся форматов в одном VBO.
Повторное использование VAO с различными шейдерами является хорошей практикой.
Однако переключение VBO и VAO обычно очень дешево по сравнению с переключением шейдеров. Это означает, что в вашем случае узкое место, вероятно, все равно переключит шейдер.
По той же причине помещать все ваши меши в один и тот же VBO, вероятно, излишне (но это не повредит, если вам не нужно его обновлять).
Кроме того, в зависимости от того, что вы визуализируете, сортировка вызовов отрисовки по глубине / состоянию наложения или по глубине (обычно спереди назад) может быть лучшим решением, чем сортировка их по шейдерам. Но это должно быть тщательно измерено. (Подробнее о сортировке Вот).
Изменить: Чтобы ответить на ваш 2-й вопрос, может быть возможно поместить вершины разных типов в одном VBO, хотя я никогда не пробовал. Это сложно, потому что вы должны быть осторожны с выравниванием вершин. При звонке glDrawArrays(mode, first, count)
например, вам нужно рассчитать first
чтобы first * sizeof(YourCurrentVertexType)
равно смещению, при котором вы помещаете свои данные в VBO. Во всяком случае, это, вероятно, не очень хорошая идея, чтобы сделать это. Некоторые водители могут не ценить это, и, как я сказал выше, это, вероятно, не будет иметь заметного значения.