Нужно ли повторно связывать униформу или атрибуты при смене шейдерных программ?

11

Для рендеринга сцены обычно используется более одной шейдерной программы, которая, в моем случае, использует одни и те же атрибуты и разделяет, по крайней мере, некоторые из униформ. Чтобы они работали должным образом, я в настоящее время играю в безопасности, то есть я перепривязываю атрибуты и получаю соответствующие одинаковые местоположения каждый раз, когда переключаюсь между шейдерными программами. Таким образом, в основном несколько раз в каждом кадре, что, вероятно, не лучший подход.

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

Если да, есть ли способ сделать это один раз при запуске программы и никогда больше не трогать их (кроме установки одинаковых значений)?

Нерон
источник

Ответы:

12

Вам не нужно перепривязывать атрибуты, если вы уверены, что их расположение остается одинаковым в обоих шейдерах. (Обычно используется layout(location = X)синтаксис в GLSL, но его также можно использовать, glBindAttribLocationесли предыдущий недоступен.)

Униформа, однако, является частью состояния объекта шейдера, и поэтому ее нужно будет установить хотя бы один раз для каждого шейдера. Одним из способов минимизировать стоимость этого является использование объекта Uniform Buffer , который будет содержать все ваши унифицированные значения и затем может быть связан с шейдером одним вызовом.

yuriks
источник
На вашей ссылке UBO: «Наконец, их можно использовать для обмена информацией между различными программами. Таким образом, изменение одного буфера может эффективно позволить унифицировать формы в нескольких программах».
Zouch