Ноды шейдеров (shader nodes)

Cycles применяет ряд оптимизаций как во время компиляции шейдера, так и во время его выполнения. Используя их, можно создавать сложные группы нод в стиле «Uber Shader», которые минимизируют накладные расходы времени рендеринга для неиспользуемых функций.

Оптимизация нод

В качестве первого шага в подготовке ноды шейдера к выполнению, Cycles развёртывает все группы нод, как при использовании инструмента «разгруппировки», и исключает только функции пользовательского интерфейса, такие как рамочные узлы и узлы перенаправления.

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

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

    RGB, Value, Mix RGB, Math, Vector Math, RGB to BW, Gamma, Brightness/Contrast, Invert, Separate/Combine RGB/XYZ/HSV, Blackbody, RGB Curves, Vector Curves, Color Ramp.

  • Обнаружить ноды Mix RGB, Math и Vector Math, которые становятся неактивными (без отмеченной галочки на Clamp) или оцениваются как 0 в результате сложения, вычитания, умножения, деления или скалярного/перекрёстного произведения с известным постоянным входом 0 или 1, и заменяет соответствующей входной связью или постоянным результатом.

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

  • Устранить ничего не делающие ноды Mix RGB (кроме Color Burn, Color Dodge, Lighten или с включённым Clamp), Invert, RGB Curves и Vector Curves с известным нулевым коэффициентом.

  • Устранить Emission и ноды шейдеров фона, которые не излучают свет и Add Shader ноды, у которых отсутствует один или оба входных аргумента.

  • Устранить Bump с постоянным входом Height, используя вместо этого его вход Normal, или Normal ноды Geometry. Это полезно для реализации входов группы нод, которые по умолчанию являются нормаль, посредством маршрутизации через нерабочую ноду Bump перед выполнением математических вычислений.

  • Заменить ноды Attribute типа View Layer на оценённое значение атрибута (оно является постоянным в пределах всего рендер-слоя).

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

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

Оптимизации времени выполнения

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

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

Open Shading Language

Если в качестве бэкэнда рендеринга выбран Open Shading Language – ноды шейдеров переводятся в код OSL, компилируются и выполняются средой выполнения OSL. В этом процессе компилятор и среда выполнения OSL применяют свои собственныи обширные наборы оптимизаций, как во время компиляции, так и во время работы шейдера.

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