Должен ли я распространять шейдеры в скомпилированном виде или в виде простого текста?

13

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

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

user827992
источник

Ответы:

15

Основное обоснование использования бинарных шейдеров заключается в том, что компиляция текстовых шейдеров слишком велика для вашего целевого устройства. Бинарные GLSL-шейдеры не имеют стандартного формата, поэтому вам понадобятся разные для каждого GPU / драйвера, который вы планируете поддерживать. Я бы порекомендовал вам распространять шейдеры в исходной форме, а затем при первом запуске кэшировать их в двоичную форму и впоследствии загружать оттуда. Затем снова я сначала проверил бы, действительно ли у вас есть узкое место в производительности, чтобы вообще оправдать использование двоичных файлов.

Стоит также обратить внимание на офлайновый оптимизатор текстовых шейдеров, который может иметь большой эффект при использовании дрянных мобильных шейдеров.

Тапио
источник
На самом деле я был бы удивлен, если бы вы могли найти какое-либо устройство, где компиляция шейдеров является узким местом. Объем кода, даже в больших шейдерах, представляет собой тривиальный объем кода с точки зрения компиляции.
edA-qa mort-ora-y
1
Большие движки обычно компилируют шейдеры в автономном режиме и / или кэшируют их при первом запуске, как предлагает Тапио. Может быть, есть тривиальный объем кода на шейдер, но их может быть много .
Лоран Кувиду
поэтому мне нужно купить случайную видеокарту ATI и другую случайную видеокарту от Nvidia, скомпилировать мои шейдеры и распространять только скомпилированную версию? Как я могу проверить во время выполнения, какая марка целевой видеокарты? Есть что-то надежное для этого?
user827992
1
@ user827992 Бинарный формат может отличаться для разных поколений графических процессоров / драйверов, даже если поставщик один и тот же. И не забывайте, что есть также много графических процессоров Intel, не говоря уже о мобильных, таких как Qualcomm и PowerVR. Итак, еще раз: я предлагаю вам не распространять скомпилированные шейдеры, а вместо этого кэшировать их при первом запуске на устройстве пользователя. Что касается обнаружения GPU, вы можете попробовать проанализировать строки GL_VENDOR, GL_VERSION и GL_RENDERER из glGetString (), но их формат варьируется от поставщика к поставщику.
Тапио