Ноды шейдеров (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 ноды, у которых отсутствует один или оба входных аргумента.

  • Eliminate Bump with constant Height input, using its Normal input or Geometry Normal instead. This is useful for implementing node group inputs that default to normal via routing through a no-op Bump before doing math.

  • Заменить ноды 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, как правило, не должна использоваться; лучше передавать информацию прямо через сокеты.