GPU Компо́зитор#

Новый компо́зитор с ускорением GPU , представленный в Blender 3.5, в настоящее время используется для композитинга вьюпорта.

Данные (data)#

Размерность#

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

Тип (type)#

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

Нецелое (float)

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

Вектор (vector)

4D вектор. Хотя он и является четырёхмерным, он может иметь разные интерпретации в зависимости от ноды, которая его использует. Его можно рассматривать как двумерный (2D) вектор с двумя последними компонентами, которые игнорируются, к примеру, вход Vector ноды Displace рассматривается как 2D вектор. Его можно рассматривать как 3D вектор с последним компонентом, например, вход Vector ноды Seperate XYZ рассматривается как 3D вектор. Его можно рассматривать как два последовательных 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) => Среднее(x, y, z)

Вектор (vector)

Цвет (color)

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

Цвет (color)

Нецелое (float)

(r, g, b, a) => Среднее(r, g, b)

Цвет (color)

Вектор (vector)

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

В следующем примере демонстрируется неявное преобразование между типом color и типом float, поскольку нода 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, поэтому вывод интуитивно обрезается до входа фона, поскольку это вход домена.#

The Alpha Over node currently doe not support changing the domain priority for its inputs, so as a workaround, one can use a Mix node to achieved the desired behavior, noting that the first Image input in the Mix node has the highest domain priority, as shown in the following figure.

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

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

Вывод (output)#

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