Шейдерные узлы

Cycles applies a number of shader node optimizations both at compile time and run-time. By exploiting them it is possible to design complicated «Uber Shader» style node groups that incur minimal render time overhead for unused features.

Оптимизации узлов

На первом шаге подготовки узла шейдера к выполнению Cycles расширяет все группы узлов, как если бы использовалась команда «Разгруппировать», и отбрасывает все возможности, влияющие только на пользовательский интерфейс, вроде узлов «Кадр» или «Перенаправление».

После этого он применяет некоторые очевидные преобразования. Например, он может (этот список не является исчерпывающим):

  • Заменить последующие узлы, результат выполнения которых постоянен, если все их входы определяются как постоянные:

    «RGB», «Значение», «Смесь RGB», «Математика», «Векторная математика», «RGB в оттенки серого», «Гамма», «Яркость/Контраст», «Инвертировать», «Разделить/Объединить RGB/XYZ/HSV», «Абсолютно чёрное тело», «RGB-кривые», «Векторные кривые», «Градиентная карта».

  • Detect Mix RGB, Math and Vector Math nodes that become no-op (without Clamp) or evaluate to 0 as a result of addition, subtraction, multiplication, division or dot/cross product with a known constant 0 or 1 input, and replace with the appropriate input link or constant result.

  • Устранить узлы «Смесь RGB» (без галки «С ограничением») и «Смешать шейдеры», когда известно, что коэффициент равен 0 или 1, соответственно заменяя входное значение или ссылку.

  • Устранить ничего не делающие узлы «Смесь RGB» (за исключением узлов с типом смешивания «Прожигание», «Осветление», «Освещение», либо с включённой галочкой «С ограничением»), «Инвертировать», «RGB-кривые» и «Векторные кривые» с известным нулевым коэффициентом.

  • Устранить узлы шейдеров «Излучение» и «Фон», которые не излучают свет и узлы «Сложить шейдеры», у которых отсутствует один или оба входных аргумента.

  • Устранить узлы «Рельеф» с константным входом высоты, используя их входы нормалей или геометрических нормалей.

  • Объединить несколько копий одного и того же узла с одинаковыми входами в один экземпляр.

Наконец, любые узлы, которые своими выходами не присоединены напрямую или опосредованно к выходному узлу, будут удалены.

Run-Time Optimizations

При выполнении шейдеров к узлам «Смешать шейдеры» применяются специальные оптимизации. Если их коэффициент вычисляется в 0 или 1, то любые узлы, доступные только по неактивной ветке узла «Смешать шейдеры», вычисляться не будут.

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

Open Shading Language

If Open Shading Language is chosen as the rendering back end, node shaders are translated to OSL code and then compiled and executed by the OSL runtime. In the process it applies its own extensive set of optimizations, both at compile time and run-time.

Open Shading Language может соптимизировать узлы «Скрипт», если их выходы не используются или константны, даже если их OSL-шейдеры имеют побочные эффекты, вроде отладочного вывода и передачи сообщений, что может привести к путанице. По этой причине передача сообщений вперёд по графу с помощью функций setmessage и getmessage, как правило, не должна использоваться; лучше явно передавать информацию через сокеты.