2012-03-13 2 views
6

Насколько быстро glUseProgram()? Есть ли что-нибудь лучше (быстрее) ?:Поведение униформ после glUseProgram() и скорости

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

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

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

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

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

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

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

ответ

6

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

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

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

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

+0

«Какие из двух вариантов лучше во многом зависят от того, что делают эти шейдеры» - задача проста - рендеринг с текстурированием без каких-либо эффектов (только некоторые из них должны иметь эффекты шейдера). –

+0

Если некоторые из них очень просты и некоторые из них имеют эффект, тогда у меня будет простой шейдер с просто текстурированием (при условии, что openg gl 2.x или выше) и по одному на класс эффектов. Но на самом деле трудно судить, не зная большего. Вероятно, это не будет иметь большого значения в общей картине. Если у вас нет проблем с производительностью и знаете, что это из-за изменений состояния, просто делайте то, что более удобно. – haffax

+1

Униформы могут совместно использоваться программами, использующими Uniform Buffer Object (см., Например, [Shared Uniforms] (http://arcsynthesis.org/gltut/Positioning/Tut07%20Shared%20Uniforms.html)) – stativ