Система компо́зитора

Данные (data)

Размерность

Ноды компо́зитинга работают с данными, которые являются либо изображением, либо безразмерным единичным значением. К примеру, нода „Levels“ выводит единичное значение, в то время как нода „Render Layers“ выводит изображение. Входы нод, которые ожидают единичное значение, присваивают значение «по умолчанию», если даётся изображение, они полностью игнорируют его, например, нода „Transform“ ожидает единичные значения для своих входов и будет присваивать значения «по умолчанию», если на эти входы были переданы изображения. Значения «по умолчанию» – это те, которые считаются тождественными и, таким образом, не оказывают влияния на вывод, поэтому для ноды „Transform“ входы „X“, „Y“ и „Angle“ будут иметь значение по умолчанию, равное нулю, в то время как вход „Scale“ будет иметь значение «по умолчанию», равное единице. С другой стороны, если входам ноды, ожидающим изображение, дано единичное значение, будет предполагаться, что это значение покроет всё пространство композиции. Например, нода „Filter“ ожидает, что её вход „Factor“ будет изображением, но если дано единичное значение, оно будет присваиваться одинаково для всех пикселей.

Тип (type)

Существуют три типа данных, которые хранятся в форматах половинной точности:

Нецелое (float)

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

Вектор (vector)

4D Вектор. Хотя он и является четырёхмерным, он может иметь разные интерпретации в зависимости от ноды, которая его использует. Его можно рассматривать как двумерный (2D) вектор с двумя последними компонентами, которые будут игнорироваться, к примеру, вход „Vectorноды „Displace“ рассматривается как двумерный вектор. Его можно рассматривать как 3D вектор с последним компонентом, который будет игнорироваться, например, вход „Vector“ ноды „Seperate XYZ“ рассматривается как трёхмерный вектор. Его можно рассматривать как два последовательных 2D вектора. Например, предполагается, что проход скорости, как и ожидается от ноды „Vector Blur“, имеет 2D предыдущую скорость в компонентах „X“ и „Y“ вектора и 2D следующую скорость в компонентах „Z“ и „W“ вектора.

Цвет (color)

Четырехмерный (4D) вектор, хранящий красный, зелёный, синий и альфа каналы цвета. Цвет имеет свободную форму и не соответствует определённому цветовому пространству или модели хранения альфа-канала, вместо этого соответствующие ноды будут иметь настройки для управления представлением их вывода, и ноды существуют для преобразования между различными представлениями.

Неявная конверсия

В случае, если на вход ноды подаются данные того типа, который отличается от его собственного – выполняются следующие неявные конверсии:

Источник (source)

Цель (target)

Преобразование (conversion)

Нецелое (float)

Вектор (vector)

f => Vector (f, f, f, 0)

Нецелое (float)

Цвет (color)

f => Color (f, f, f, 1)

Вектор (vector)

Нецелое (float)

(x, y, z, w) => Average (x, y, z)

Вектор (vector)

Цвет (color)

(x, y, z, w) => Color (x, y, z, 1)

Цвет (color)

Нецелое (float)

(r, g, b, a) => Luminance (r, g, b)

Цвет (color)

Вектор (vector)

(r, g, b, a) => Vector (r, g, b, 0)

В следующем примере демонстрируется неявная конверсия между „цветовым“ и „нецелым“ типами, поскольку нода „Math“ ожидает входные данные типа „Float“.

../_images/compositing_realtime-compositor_compositing-space_data_type_implicit_conversion.png

Пример, демонстрирующий неявную конверсию между типом „color“ и типом „float“, поскольку нода „Mathожидает входные данные типа „float“.

Композиционное пространство

Домен изображения

Компо́зитор разработан таким образом, чтобы обеспечить возможность компоновки в бесконечном пространстве композитинга. Следовательно, изображения представлены не только посре́дством своего размера, но и своей трансформацией в этом пространстве, подобно тому, как свои трансформации имеют 3D-объекты. Идентичная трансформация представляет собой изображение, центрированное в пространстве. Прямоугольная область, занимаемая изображением в этом пространстве, определяемая его трансформацией и размером, называется доменом изображения. На рисунке ниже показаны домены двух примеров изображений.

../_images/compositing_realtime-compositor_compositing-space_image-domain_example.png

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

Изображения можно преобразовывать с помощью таких нод, как „Transform“, „Translate“ и „Rotate“.

Домен операций

Ноды компо́зитинга работают в определённой прямоугольной области пространства компоновки, называемой доменом для операций. Ноды учитывают только область входных изображений, которые перекрывают домен операций, и игнорируют остальные изображения. Если входное изображение перекрывает домен операций не полностью – остальная часть домена для этого ввода будет считаться нулевым значением, нулевым вектором или прозрачным нулевым цветом в зависимости от типа.

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

../_images/compositing_realtime-compositor_compositing-space_operation-domain_example.png

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

Предыдущая иллюстрация представляет собой реальный пример, в котором используется нода „Alpha Over“ для наложения небольшого логотипа на изображение, как показано на рисунке ниже. В этом случае область операций охватывает всю область просмотра – как будет показано позже, но логотип охватывает только небольшую её область, поэтому предполагается, что остальная область имеет нулевой прозрачный цвет, что удобно для использования в нашем случае.

../_images/compositing_realtime-compositor_compositing-space_operation-domain_real-example.png

Пример из реального мира, где нода „Alpha Over“ используется для наложения небольшого логотипа на изображение. Логотип покрывает только небольшую область домена операций , которая в данном случае представляет собой весь вьюпорт, поэтому предполагается, что остальная область имеет нулевой прозрачный цвет.

Интерполяция (interpolation)

Если входное изображение ноды выровнено с доменом операций ноды не идеально, или имеет другой размер в пикселях – ноде обычно необходимо выполнить процесс, называемый интерполяцией, где входное изображение считывается в точных позициях пикселей домена операций. Это можно сделать с помощью различных методов интерполяции, включая интерполяцию по „ближайшим соседям“, „билинейную“ и „бикубическую“ интерполяцию. Эти методы интерполяции продемонстрированы в следующей «галерее Википедии». Ноды трансформации, такие как „Transform“ и „Rotate“, включают в себя опцию интерполяции, для того, чтобы задавать предпочитаемое считывание и интерполирование своих выходных изображений.

Определение домена операций

Остаётся вопрос о том, как ноды определяют свою область действия. Различные типы нод могут иметь разные механизмы определения своей области действия. Но, как правило, существуют три класса нод, когда речь идёт о механизме определения области действия, каждый из которых представлен в одном из следующих разделов.

Ноды ввода (input nodes)

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

Ноды вывода (output nodes)

Доменом операций узлов вывода, таких как нода „Viewer“, является домен с тождественной трансформацией и тем же размером, что и конечный вывод компо́зитора. Для компо́зитинга вьюпорта этот размер будет размером вьюпорта, а для финального компо́зитинга рендера этот размер будет размером рендеринга сцены.

Другие ноды (other nodes)

Если на соответствующих страницах документации не указано иное – все остальные ноды используют следующий механизм. Один из входов нод обозначается как «вход домена» ноды, и домен операций ноды идентичен домену этого обозначенного входа. Для многих нод вход домена может быть интуитивно идентифицирован как основной вход ноды, например, входом домена для ноды „Filter“ является вход „Image“. Но следует отметить некоторые оговорки, которые требуют более глубокого понимания механизма.

Каждый вход в ноду имеет так называемое свойство «приоритета домена», домен операций ноды – это доменный вход не единичных значений с наивысшим приоритетом домена. Так, например, нода „Filter“ имеет два входа, приоритет домена входа „Image“ выше, чем у входа „Factor“, и существует четыре возможных конфигурации:

  • Оба входа „Image“ и „Factor“ присоединены к изображениям. В этом случае вход „Image“ является доменным входом, поскольку он имеет наивысший приоритет и подсоединён к изображению.

  • Вход „Image“ подсоединён к изображению, а вход „Factor“ – нет. В этом случае вход „Image“ является доменным входом, поскольку это единственный вход, подсоединённый к изображению, независимо от его приоритета.

  • Вход „Image“ не подключён к изображению, а вход „Factor“ – подключён. В этом случае вход „Factor“ является доменным входом, поскольку это единственный вход, подключённый к изображению, независимо от его приоритета.

  • Ни вход „Image“, ни вход „Factor“ не подключены к изображениям – в данном случае доменного входа нет, поскольку нода оценивается по единичным значениям.

Соображения

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

Отсечение (clipping)

Выход нод будет интуитивно отсечён до домена операций или, скорее, до области доменного входа. Например, если вход переднего плана больше, чем вход фона в ноде „Alpha Over“, выход будет обрезан до входа фона, поскольку он является входом домена, как показано на следующем рисунке.

../_images/compositing_realtime-compositor_compositing-space_operation-domain_considerations_clipping.png

Вход переднего плана больше, чем вход фона в ноде „Alpha Over“, поэтому вывод интуитивно обрезается до входа фона, поскольку он является входом домена.

Нода „Alpha Over“ в настоящее время не поддерживает изменений приоритета домена для своих входов, поэтому в качестве обходного пути можно использовать ноду „Mix“ для достижения желаемого поведения, учитывая, что первый вход „Image“ в ноде „Mix“ имеет наивысший приоритет домена, как показано на следующем рисунке.

../_images/compositing_realtime-compositor_compositing-space_operation-domain_considerations_clipping-solution.png

Обход поведения с отсечением, производимое нодой „Alpha Over“ с использованием ноды „Mix“, при этом следует отметить, что первый вход „Image“ в ноде „Mix“ имеет наивысший приоритет домена

Вывод (output)

Компо́зитор поддерживает только одну активную цель вывода, то есть только одна из нод „Group Output“ или нод „Viewer“ в дереве нод будет считаться активной, остальные будут игнорироваться. В частности, компо́зитор будет искать контекст активного дерева нод и возвращаться к контексту корневого дерева нод если в контексте активного дерева нод не найдено активного вывода. Контекст активного дерева нод – это дерево нод развёрнутой группы нод, то есть когда пользователи выбирают ноду группы узлов и редактируют лежащее в её основе дерево, в то время как контекст корневого дерева нод – это дерево нод высшего уровня без каких-либо развёрнутых групп узлов.

Компо́зитор ищет активную ноду „Group Output“. Если она не найдена, он ищет активную ноду „Viewer“. Если ни одна из них не была найдена, композитор и вовсе не будет запускаться. Следовательно, обратите внимание, добавление ноды „Viewer“ не повлияет на рендеринг вьюпорта при наличии ноды „Group Output“, поскольку приоритет отдаётся именно нодам „Group Output“.