Сколько программ OpenGL я должен использовать для рендеринга нескольких объектов?

10

В моей сцене несколько объектов. (Допустим, 3 куба, 1 цилиндр, 8 сфер.) Я предполагаю, что мне нужно создать вершинный шейдер для каждого. Сколько программ мне нужно иметь?

Альтернативы:

  • Одна программа на объект
  • Одна программа для всех кубов и другая для всех сфер (при условии, что они используют одни и те же шейдеры)
  • Одна большая программа для всего

Какой правильный подход?

Jacks_Gulch
источник
1
«Полагаю, мне нужно создать вершинный шейдер для каждого». Почему ты это предполагаешь? Вершинный шейдер преобразует вершины в соответствии с вашей моделью и матрицами представления, и вы почти всегда хотите, чтобы это было одинаково для всех.
usm

Ответы:

8

Вы должны рассматривать шейдерные программы как подобную часть состояния как текстуры. Изменение состояния обходится дорого, поэтому вы можете избежать объединения нескольких текстур в одну, чтобы избежать изменения текстуры; То же самое относится и к шейдерам - вы можете комбинировать несколько шейдеров, чтобы избежать изменений состояния.

Подобно объединению текстур, объединение шейдеров сопряжено с накладными расходами - если вы визуализируете только область 16x16 пикселей из текстуры 4096x4096, вы не используете оборудование эффективно. Точно так же, если объект, который вы визуализируете, использует только 10% кода в вашем шейдере, вполне возможно (и даже вероятно), что графическая карта вычисляет много вещей без необходимости.

Короче говоря, «зависит».

Яри ​​Комппа
источник
4
Кроме того, во многих случаях вы можете использовать только один шейдер. Различия только в форме, которую вы передаете шейдеру, например, цвет, текстура, карты нормалей и т. Д.
rioki
Да, например, у вас может быть шейдер Scaly, который производит фрагменты, которые выглядят чешуйчатыми, и который работает таким образом (большинство шейдеров делают ...), что вы можете визуализировать все 3 куба, 1 цилиндр и 8 сфер, используя этот один шейдер (с соответствующими геометрическими примитивами, конечно). Разумным набором униформы здесь может быть векторное значение, определяющее цвет, и, возможно, несколько скаляров или что-то, что влияет на то, насколько «чешуйчатым» или «блестящим» будет визуальный эффект. Затем у вас есть один шейдер, и вы изменяете, как шейдер окрашивает фрагменты, изменяя форму между рисунками отдельных геометрий.
Стивен Лу
5

Лучше, чтобы все было как можно проще. Дублирование одного и того же шейдера для каждого объекта не является необходимым и быстро раздувается. Вам также не нужен один гигантский шейдер, который покрывает все возможные варианты использования, так как это приводит к ненужным накладным расходам.

Существует несколько мнений по поводу управления шейдерами, и нет «оптимального» подхода к этому. Я даже видел некоторые реализации шейдеров, где каждый шейдер генерируется на лету на основе параметров (например, в движке Unreal ).

Для кого-то, кто только начинает в этой области, было бы хорошо сначала набросать основные шейдеры. Например, у меня есть шейдер для объектов без текстур, шейдер с базовой текстурой и поддержкой освещения на пиксель и т. Д. ... Затем каждый раз, когда я хочу получить другой эффект, который нельзя сделать с помощью предыдущего шейдера, я Я создам новый для нового эффекта.

Целью такой системы является простота. Просто. Хранить. Это. Просто.

Анко
источник
+1, потому что вы упомянули, что делает текущая индустрия.
Krythic