Поведение униформы после glUseProgram () и скорости - PullRequest
8 голосов
/ 13 марта 2012

Как быстро работает glUseProgram ()? Есть ли что-нибудь лучше (быстрее)?:

Вот мои мысли:

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

В каком состоянии находится униформа после смены шейдерной программы? Сохраняют ли они значения (например, значения матриц)?

Вот что я считаю преимуществами # 1:

  • Не использует glUseProgram ()

И преимущества # 2:

  • Матрица не изменяется (например, если класс Menu и класс Scene3D имеют разные матрицы проекций)

1 Ответ

9 голосов
/ 13 марта 2012

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

Это сказало: имейте в виду, есть не только стоимость для изменения состояния, но также и стоимость времени выполнения шейдера, и это заплачено за вершину и за фрагмент. Поэтому держать шейдер на низком уровне - это всегда хорошая идея, а универсальный шейдер сложнее, чем специализированный.

Минимизировать изменение состояния. Если у вас есть объекты A, C, E, использующие Программу X, и B, D, F, использующие Программу Y, тогда, при прочих равных условиях, визуализируйте в порядке ACEBDF, а не ABCDEF.

Относительно последнего вопроса: программы сохраняют свое состояние и, следовательно, значения униформы в течение всего срока их действия, если вы не связываете их. Но формы для каждого состояния программы означают, что если у вас есть две формы с одинаковым именем и типом в разных программах, значения не будут перенесены из одной программы в другую.

...