2015-01-13 6 views
3

Я пишу визуализатор и нахожусь в точке, чтобы выбрать окончательный способ управления vao/vbo/shader. В Интернете я нашел весьма противоречивую информацию о том, что на самом деле рекомендуется. В настоящее время идея следующая:OpenGL VAO VBO shaders confusion

-Один VBO хранит все ячейки последовательно.

-Per "shader mapping" создает 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.

+1

* Это решение оптимально вообще * - никто не знает. Вы должны просмотреть его. –

+2

afaik, уменьшающий количество вызовов привязанных васов и программ, так же хорош, как и получается, мне было бы интересно узнать еще несколько экспертных мнений, хотя – BeyelerStudios

+0

thx, тогда я просто попробую. Мне просто интересно, была ли моя общая мысль о VBO/VAO правильной до внедрения. – Teris

ответ

4

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

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

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

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

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

Смежные вопросы