В моей сцене несколько объектов. (Допустим, 3 куба, 1 цилиндр, 8 сфер.) Я предполагаю, что мне нужно создать вершинный шейдер для каждого. Сколько программ мне нужно иметь?
Альтернативы:
- Одна программа на объект
- Одна программа для всех кубов и другая для всех сфер (при условии, что они используют одни и те же шейдеры)
- Одна большая программа для всего
Какой правильный подход?
opengl
shaders
architecture
Jacks_Gulch
источник
источник
Ответы:
Вы должны рассматривать шейдерные программы как подобную часть состояния как текстуры. Изменение состояния обходится дорого, поэтому вы можете избежать объединения нескольких текстур в одну, чтобы избежать изменения текстуры; То же самое относится и к шейдерам - вы можете комбинировать несколько шейдеров, чтобы избежать изменений состояния.
Подобно объединению текстур, объединение шейдеров сопряжено с накладными расходами - если вы визуализируете только область 16x16 пикселей из текстуры 4096x4096, вы не используете оборудование эффективно. Точно так же, если объект, который вы визуализируете, использует только 10% кода в вашем шейдере, вполне возможно (и даже вероятно), что графическая карта вычисляет много вещей без необходимости.
Короче говоря, «зависит».
источник
Лучше, чтобы все было как можно проще. Дублирование одного и того же шейдера для каждого объекта не является необходимым и быстро раздувается. Вам также не нужен один гигантский шейдер, который покрывает все возможные варианты использования, так как это приводит к ненужным накладным расходам.
Существует несколько мнений по поводу управления шейдерами, и нет «оптимального» подхода к этому. Я даже видел некоторые реализации шейдеров, где каждый шейдер генерируется на лету на основе параметров (например, в движке Unreal ).
Для кого-то, кто только начинает в этой области, было бы хорошо сначала набросать основные шейдеры. Например, у меня есть шейдер для объектов без текстур, шейдер с базовой текстурой и поддержкой освещения на пиксель и т. Д. ... Затем каждый раз, когда я хочу получить другой эффект, который нельзя сделать с помощью предыдущего шейдера, я Я создам новый для нового эффекта.
Целью такой системы является простота. Просто. Хранить. Это. Просто.
источник