Shader Nodes#
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 расширяет все группы узлов, как если бы использовалась команда «Разгруппировать», и отбрасывает все возможности, влияющие только на пользовательский интерфейс, вроде узлов «Кадр» или «Перенаправление».
After that, it applies some obvious transformations, for example, it can (the list is not exhaustive):
Заменить последующие узлы, результат выполнения которых постоянен, если все их входы определяются как постоянные:
«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, соответственно заменяя входное значение или ссылку.
Eliminate no-op Mix RGB (except Color Burn, Color Dodge, Lighten, or enabled Clamp), Invert, RGB Curves and Vector Curves nodes with known zero Factor.
Устранить узлы шейдеров «Излучение» и «Фон», которые не излучают свет и узлы «Сложить шейдеры», у которых отсутствует один или оба входных аргумента.
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.
Replace Attribute nodes of the View Layer type with the evaluated attribute value (it is constant within the whole Render Layer).
Объединить несколько копий одного и того же узла с одинаковыми входами в один экземпляр.
Finally, any nodes that end up not connected either directly or indirectly to the Output node are removed.
Run-Time Optimizations#
При выполнении шейдеров к узлам «Смешать шейдеры» применяются специальные оптимизации. Если их коэффициент вычисляется в 0 или 1, то любые узлы, доступные только по неактивной ветке узла «Смешать шейдеры», вычисляться не будут.
This can substantially reduce the performance cost of combining multiple materials in one shader with a Color Attribute, texture, or other input used as a switch.
Open Shading Language#
If Open Shading Language is chosen as the rendering backend, 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
, как правило, не должна использоваться; лучше явно передавать информацию через сокеты.