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.

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

Compositor Nodes operate on a specific rectangular area of the compositing space called the Operation Domain. The nodes only consider the area of the input images that overlap the operation domain and ignores the rest of the images. If an input image doesn’t completely overlap the operation domain, the rest of the operation domain for that input will be assumed to be a zero value, a zero vector, or a transparent zero color depending on the type.

For instance, the figure below illustrates a case where the operation domain of a node is the large blue area and the domain of an input image is the small red area. In that case, the input image doesn’t completely overlap the operation domain, so the rest of the blue area for that input image is assumed to be zero.

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

An example case where the operation domain of a node is shown in blue and the domain of an input image is shown in red. Since the input image doesn’t completely cover the operation domain of the node, the rest of the blue area for that input image is assumed to be zero.#

The previous illustration is a representation of a real world example where one uses the Alpha Over node to overlay a small logo on an image, as shown in the figure below. In that case, the operation domain covers the entirety of the viewport — as will later be demonstrated, but the logo covers only a small area of it, so the rest of the area is assumed to be a zero transparent color, which is convenient for the use case.

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

A real world example where the Alpha Over node is used to over a small logo on an image. The logo only covers a small area of the operation domain, which is the whole viewport in this case, so the rest of the area is assumed to be a zero transparent color.#

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

If an input image to a node is not perfectly aligned with the operation domain of the node or have a different size in pixels, the node would typically need to do a process called Interpolation, where the input image is read at the exact positions of the pixels of the operation domain. This can be done using different interpolation methods, including Nearest-Neighbor, Bilinear, and Bicubic interpolations. Those interpolation methods are demonstrated in the following Wikipedia gallery. Transformation nodes like the Transform and Rotate nodes include an interpolation option to set how they prefer their output image to be read and interpolated.

Determining Operation Domain#

The question remains on how nodes determine their operation domain. Different node types can have different mechanisms for determining their operation domain. But generally, three classes of nodes exist when it comes to the mechanism of determining the operation domain, each of which is presented in one of the following sections.

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

The operation domain of input nodes like the Image node is a domain with an identity transformation and the same size as their outputs, so for the Image node, the operation domain will be the domain whose size is the size of the image and whose transformation is an identity one.

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

The operation domain of output nodes like the Viewer node is a domain with an identity transformation and the same size as the final compositor output. For viewport compositing, that size would be the viewport size, and for final render compositing, that size would be the scene render size.

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

Unless stated otherwise in their respective documentation pages, all other nodes use the following mechanism. One of the inputs of the nodes is designated as the Domain Input of the node, and the operation domain of the node is identical to the domain of that designated input. For many nodes, the domain input can be intuitively identified as the main input of the node, for instance, the domain input for the Filter node is the Image input. But there are some caveats to note, which requires a deeper understanding of the mechanism.

Each input in the node has the so called Domain Priority property, the operation domain of the node is the domain of the non single value input with the highest domain priority. So for instance, the Filter node has two inputs, the domain priority of the Image input is higher than that of the Factor input, and there are four possible configurations:

  • Both the Image and factor inputs are connected to images. In this case, the Image input is the domain input because it has the highest priority and is connected to an image.

  • The Image input is connected to an image, but the Factor input isn’t. In this case, the Image input is the domain input because it it is the only input connected to an image regardless of its priority.

  • The Image input is not connected to an image but the Factor input is. In this case, the Factor input is the domain input because it is the only input connected to an image regardless of its priority.

  • Neither the Image nor the Factor inputs are connected to images, in this case, there isn’t a domain input because the node is evaluated on single values.

Considerations#

The aforementioned mechanism for determining the operation domain has a number of consequences that needs to be considered as they might be undesirable, each of which is presented in one of the following sections.

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

The output of nodes will be intuitively clipped to the operation domain, or rather, the domain of the domain input. For instance, if the Foreground input is bigger than the Background input in the Alpha Over node, the output will be clipped to the Background input because it is the domain input, as shown in the following figure.

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

The Foreground input is bigger than the Background input in the Alpha Over node, so the output is intuitively clipped to the Background input because it is the domain input.#

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

Working around the clipping behavior of the Alpha Over node using a Mix node, noting that the first Image input in the Mix node has the highest domain priority#

Вывод (output)#

The GPU compositor only supports a single active output target, that is, only one of the Composite nodes or Viewer nodes in the node tree will be considered active and the rest will be ignored. In particular, the compositor searches the Active Node Tree Context and falls back to the Root Node Tree Context if no active output was found in the active node tree context. The active node tree context is the node tree of an expanded node group, that is, when the users selects a node group node and edits its underlying tree, while the root node tree context is the top level node tree without any expanded node groups. The compositor searches for the active Composite node, if non was found, it searches for the active Viewer node, be it a Viewer or a Split Viewer node, if non was found, the compositor doesn’t run altogether. Consequently, note that adding a Viewer node will have no effect if there is a Composite node, since the priority is given to Composite nodes.