Unity 6.3
0 онлайн 134 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 372 из 442

Компиляция шейдеров

Каждый раз, когда вы строите свой проект, Unity Editor компилирует все шейдеры, необходимые для вашей сборки: каждый необходимый вариант шейдера, для каждой требуемой графики API.

Когда вы работаете в Unity Editor, Редактор не компилирует все заранее. Это потому, что компиляция каждого варианта для каждой графики API может занять очень много времени.

Вместо этого Unity Editor делает следующее:

  • При импорте ресурса шейдера выполняется минимальная обработка (например, генерация шейдера поверхности).
  • Когда ему нужно показать вариант шейдера, он проверяет папку Library/ShaderCache.
  • Если он находит ранее скомпилированный вариант шейдера, использующий идентичный исходный текст, он использует его.
  • Если соответствия не найдено, то компилируется требуемый вариант шейдера и результат сохраняется в кэше.

Компиляция шейдеров осуществляется с помощью процесса под названием UnityShaderCompiler. Можно запустить несколько процессов UnityShaderCompiler (обычно один на каждое ядро CPU в вашей машине), так что во время сборки плеера компиляция шейдеров может быть выполнена параллельно. Пока Редактор не компилирует шейдеры, процессы компилятора ничего не делают и не потребляют компьютерные ресурсы.

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

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

Различные компиляторы шейдеров

Различные платформы используют разные шейдерные компиляторы для компиляции шейдерной программы следующим образом:

  • Платформы, использующие DirectX, используют компилятор Microsoft FXC HLSL.
  • Платформы, использующие OpenGL (Core и ES) используют компиляторы Microsoft FXC HLSL, за которыми следует перевод байт-кода в GLSL с помощью HLSLcc.
  • Платформы, использующие Metal, используют компилятор Microsoft FXC HLSL, за которым следует перевод байт-кода в Metal, используя HLSLcc.
  • Платформы, использующие Vulkan, используют компиляторы Microsoft FXC HLSL, затем перевод байт-кода в GLSL с помощью HLSLcc, затем в SPIR-V с помощью компилятора glslang.
  • Другие платформы, такие как консольные платформы, используют свои соответствующие компиляторы.
  • Поверхностные шейдеры используйте HLSL и MojoShader для этапа анализа генерации кода.

Вы можете настроить различные параметры компилятора шейдера, используя директивы.

Препроцессор кэширующего шейдера

Компиляция шейдера включает в себя несколько этапов. Один из первых этапов — предварительная обработка. Во время этого этапа программа под названием preprocessor готовит исходный код шейдера для компилятора.

В предыдущих версиях Unity Редактор использовал препроцессор, предоставляемый компилятором шейдеров для текущей платформы. Теперь Unity использует свой собственный препроцессор, также называемый Preprocessor Caching Shader.

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

Подробную информацию о различиях между Кэширующим препроцессором шейдера и предыдущим поведением см. на форуме Unity: New shader preprocessor.

Стриптинг времени построения

В процессе сборки игры Unity может определить, что часть внутренних вариантов шейдеров игрой не используется, и исключить («вырезать») их из данных сборки. Подробнее см. Варианты шейдеров.