Шейдеры OpenGL VAO VBO путаница

Я пишу рендер и собираюсь выбрать последний способ управления 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.

3

Решение

Повторное использование VAO с различными шейдерами является хорошей практикой.

Однако переключение VBO и VAO обычно очень дешево по сравнению с переключением шейдеров. Это означает, что в вашем случае узкое место, вероятно, все равно переключит шейдер.

По той же причине помещать все ваши меши в один и тот же VBO, вероятно, излишне (но это не повредит, если вам не нужно его обновлять).

Кроме того, в зависимости от того, что вы визуализируете, сортировка вызовов отрисовки по глубине / состоянию наложения или по глубине (обычно спереди назад) может быть лучшим решением, чем сортировка их по шейдерам. Но это должно быть тщательно измерено. (Подробнее о сортировке Вот).

Изменить: Чтобы ответить на ваш 2-й вопрос, может быть возможно поместить вершины разных типов в одном VBO, хотя я никогда не пробовал. Это сложно, потому что вы должны быть осторожны с выравниванием вершин. При звонке glDrawArrays(mode, first, count) например, вам нужно рассчитать first чтобы first * sizeof(YourCurrentVertexType) равно смещению, при котором вы помещаете свои данные в VBO. Во всяком случае, это, вероятно, не очень хорошая идея, чтобы сделать это. Некоторые водители могут не ценить это, и, как я сказал выше, это, вероятно, не будет иметь заметного значения.

4

Другие решения


По вопросам рекламы [email protected]