GPU Compositor

Le nouveau compositeur accéléré par GPU introduit dans Blender 3.5 qui est actuellement utilisé pour la composition de la fenêtre. Ce compositeur est actuellement assez limité et tous les nœuds de composition ne sont pas pris en charge, ces nœuds sont marqués avec l’étiquette CPU Compositor Only ainsi que de notes sur d’autres limitations. De plus, MacOS n’est pas pris en charge en raison de l’absence de prise en charge de l’OpenGL moderne.

Données

Dimensionnalité

Les nœuds de composition fonctionnent sur des données qui sont soit une image ou une valeur unique sans dimension. Par exemple, le nœud Levels sortira une seule valeur, tandis que le nœud Render Layers sortira une image. Les entrées de nœud qui s’attendent à une valeur unique supposent une valeur par défaut si une image est donnée et ignorent complètement l’image, par exemple, le nœud Transform attend des valeurs uniques pour ses entrées et supposera des valeurs par défaut si des images sont données à ces entrées. Les valeurs par défaut sont celles qui sont considérées comme une identité et n’ont donc aucun effet sur la sortie, donc pour le nœud Transform, les entrées X, Y et Angle auront une valeur par défaut de zéro, tandis que l’entrée Scale aura une valeur par défaut de 1. D’un autre côté, si les entrées de nœud qui s’attendent à une image reçoivent une valeur unique, la valeur unique sera supposée couvrira l’ensemble de l’espace de composition. Par exemple, le nœud Filter s’attend à ce que son entrée Factor soit une image, mais si une seule valeur est donnée, elle sera supposée être la même pour tous les pixels.

Type

Il existe trois types de données, qui sont tous stockés dans des formats half precision :

Float

Un nombre floating-point signé. Les données entières sont également stockées sous forme de flottants car aucun type entier n’existe.

Vector

Un vecteur 4D. Bien qu’il soit 4D, il peut avoir des interprétations différentes en fonction du nœud qui l’utilise. Il peut être traité comme un vecteur 2D avec les deux derniers composants ignorés, par exemple, l’entrée Vector du nœud Displace est traitée comme un vecteur 2D. Il peut être traité comme un vecteur 3D avec le dernier composant ignoré, par exemple, l’entrée Vector du nœud Seperate XYZ node est traité comme un vecteur 3D. Il peut être traité comme deux vecteurs 2D consécutifs. Par exemple, Velocity Pass comme prévu par le nœud Vector Blur est supposé avoir 2D Previous Velocity dans les composants X et Y du vecteur et 2D Next Velocity dans les composants Z et W du vecteur.

Color

Un vecteur 4D stockant le rouge, le vert, le bleu et l’alpha de la couleur. La couleur est une forme libre et ne se conforme pas à un modèle d’espace colorimétrique ou à un modèle de stockage alpha, au lieu de cela, les nœuds appropriés auront des paramètres pour contrôler la représentation de leur sortie et des nœuds existent pour des convertions entre les différentes représentations.

Conversion implicite

Dans le cas où une entrée de nœud reçoit des données de type autre que son propre type, les conversions implicites suivantes sont effectuées :

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) => Average(r, g, b)

Color

Vector

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

L’exemple suivant démontre une conversion implicite entre un type de couleur et un type float, car le nœud Math s’attend à des entrées float.

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

Un exemple qui démontre une conversion implicite entre un type de couleur et un type float, car le nœud Math attend des entrées float.

Composition spaciale

Domaine de l’image

Le compositeur est conçu de manière à permettre la composition dans un espace de composition infini. Par conséquent, les images ne sont pas seulement représentées par leur taille, mais aussi par leur transformation dans cet espace, tout comme les objets 3D ont des transformations. Une transformation d’identité représente une image centrée dans l’espace. La zone rectangulaire occupée par une image dans cet espace telle que définie par sa transformation et sa taille est appelée le domaine de l’image. La figure ci-dessous montre les domaines de deux exemples d’images.

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

Les domaines de deux exemples d’images sont illustrés sur l’espace de composition. L’une des images est centrée dans l’espace et l’autre est réduite et traduite de telle sorte qu’elle se trouve dans le quadrant supérieur droit de l’espace. Notez que les deux images ont des tailles similaires dans les pixels, mais leurs tailles apparentes sont différentes.

Les images peuvent être transformées à l’aide de nœuds comme les nœuds Transform, Translate et Rotate.

Domaine d’opération

Les nœuds Compositor fonctionnent sur une zone rectangulaire spécifique de l’espace de composition appelée Operation Domain (domaine de fonctionnement). Les nœuds ne considèrent que la zone des images d’entrée qui chevauchent le domaine de fonctionnement et ignore le reste des images. Si une image d’entrée ne chevauche pas complètement le domaine de fonctionnement, le reste du domaine de fonctionnement pour cette entrée sera supposé être une valeur nulle, un vecteur zéro ou une couleur zéro transparente en fonction du type. Ce comportement peut être modifié dans une certaine mesure, voir la section Wrapping ci-dessous.

Par exemple, la figure ci-dessous illustre un cas où le domaine de fonctionnement d’un nœud est la grande zone bleue et le domaine d’une image d’entrée est la petite zone rouge. Dans ce cas, l’image d’entrée ne chevauche pas complètement le domaine de fonctionnement, de sorte que le reste de la zone bleue pour cette image d’entrée est supposé nul.

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

Un exemple de cas où le domaine de fonctionnement d’un nœud est illustré en bleu et le domaine d’une image d’entrée est illustré en rouge. Étant donné que l’image d’entrée ne couvre pas complètement le domaine de fonctionnement du nœud, le reste de la zone bleue pour cette image d’entrée est supposé nul.

L’illustration précédente est une représentation d’un exemple du monde réel où l’on utilise le nœud Alpha Over pour superposer un petit logo sur une image, comme le montre la figure ci-dessous. Dans ce cas, le domaine d’opération couvre l’intégralité de la vue de la fenêtre – comme cela sera plus tard démontré, mais le logo ne couvre qu’une petite zone, de sorte que le reste de la zone est supposé être une couleur transparente nulle, ce qui est pratique pour le cas d’utilisation.

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

Un exemple du monde réel où le nœud Alpha Over est utilisé pour sur un petit logo sur une image. Le logo ne couvre qu’une petite zone du domaine d’opération, qui est toute la fenêtre dans ce cas, de sorte que le reste de la zone est supposé être une couleur transparente nulle.

Interpolation

Si une image d’entrée d’un nœud n’est pas parfaitement alignée sur le domaine de fonctionnement du nœud ou a une taille différente en pixels, le nœud devrait «  « généralement effectuer un processus appelé interpolation, où l’image d’entrée est lue aux positions exactes des positions des pixels du domaine d’opération. Cela peut être fait en utilisant différentes méthodes d’interpolation, notamment les interpolations au plus proche voisin, bilinéaire et bicubic (Nearest-Neighbor, Bilinear et Bicubic). Ces méthodes d’interpolation sont «  « démontrées dans Wikipedia gallery. Les nœuds de transformation comme les nœuds Transform et Rotate incluent une option d’interpolation pour définir la façon dont ils préfèrent lire et interpoler leur image de sortie.

Notez que les nœuds de transformation ne font pas eux-mêmes des interpolations, ils enregistrent simplement la méthode d’interpolation préférée pour l’image de sortie et les derniers des nœuds qui lisent cette image sera le nœud qui fait l’interpolation réelle. Il s’ensuit que les derniers nœuds de transformation écraseront les méthodes d’interpolation définies par d’anciens nœuds de transformation si aucune interpolation n’a eu lieu entre les deux.

Wrapping

Bien qu’il ait été précédemment indiqué que les zones des images d’entrée qui ne chevauchent pas le domaine de fonctionnement sont supposées être nulles, ce n’est que le comportement par défaut. Le comportement alternatif consiste à demander au compositeur de répéter l’image d’entrée pour remplir les zones manquantes le long de la direction horizontale, de la direction verticale ou des deux. Cela peut être défini dans l’option Wrap du nœud Translate. Tout comme la méthode d’interpolation susmentionnée, le nœud Translate ne fait aucun wrapping lui-même, il définit simplement la méthode préférée de remplissage des espaces vides et le dernier des nœuds qui lisent l’image sera le nœud qui fait le wrapping réel.

Par exemple, l’exemple précédent Alpha Over mais avec Both Axis Wrapping activé est illustré dans la figure ci-dessous.

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

L’exemple précédent avec l’exemple Alpha Over mais avec Both Axis Wrapping activé.

Déterminer le domaine de fonctionnement

La question demeure sur la façon dont les nœuds déterminent leur domaine de fonctionnement. Différents types de nœuds peuvent avoir différents mécanismes pour déterminer leur domaine de fonctionnement. Mais généralement, trois classes de nœuds existent en ce qui concerne le mécanisme de détermination du domaine de fonctionnement, dont chacun est présenté dans l’une des sections suivantes.

Les nœuds Input

Le domaine de fonctionnement des nœuds d’entrée comme le nœud Image est un domaine avec une transformation d’identité et de la même taille que leurs sorties, donc pour le nœud Image, le domaine d’opération sera le domaine dont la taille est celle de l’image et dont la transformation est une identité.

Les nœuds Output

Le domaine de fonctionnement des nœuds de sortie comme le nœud Viewer est un domaine avec une transformation d’identité et de la même taille que la sortie du compositeur final. Pour la composition de la vue, cette taille serait la taille de la fenêtre et pour la composition du rendu final, cette taille serait la taille du rendu de la scène.

Autres Nœuds

Sauf indication contraire dans leurs pages de documentation respectives, tous les autres nœuds utilisent le mécanisme suivant. L’une des entrées des nœuds est désignée comme entrée de domaine du nœud et le domaine de fonctionnement du nœud est identique au domaine de cette entrée désignée. Pour de nombreux nœuds, l’entrée de domaine peut être identifiée intuitivement comme l’entrée principale du nœud, par exemple, l’entrée de domaine pour le nœud Filter est l’entrée Image. Mais il y a quelques mises en garde à noter, ce qui nécessite une compréhension plus profonde du mécanisme.

Chaque entrée dans le nœud a la propriété dite Domain Priority, le domaine de fonctionnement du nœud est le domaine de l’entrée de valeur non simple avec la priorité de domaine la plus élevée. Ainsi, par exemple, le nœud Filter a deux entrées, la priorité de domaine de l’entrée Image est supérieure à celle de l’entrée Factor et il y a quatre configurations possibles :

  • Les entrées Image et Factor sont connectées aux images. Dans ce cas, l’entrée Image est l’entrée de domaine car elle a la priorité la plus élevée et est connectée à une image.

  • L’entrée Image est connectée à une image, mais l’entrée Factor ne l’est pas. Dans ce cas, l’entrée Image est l’entrée de domaine car elle est la seule entrée connectée à une image quelle que soit sa priorité.

  • L’entrée Image n’est pas connectée à une image mais l’entrée du Factor l’est. Dans ce cas, l’entrée Factor est l’entrée de domaine car elle est la seule entrée connectée à une image quelle que soit sa priorité.

  • Ni l’entrée Image, ni l’entrée Factor ne sont connectées aux images, dans ce cas, il n’y a pas d’entrée de domaine car le nœud est évalué sur des valeurs uniques.

Considérations

Le mécanisme susmentionné pour déterminer le domaine d’opération a un certain nombre de conséquences qui doivent être prises en compte car elles pourraient être indésirables, chacune est présentée dans l’une des sections suivantes.

Clipping

La sortie des nœuds sera intuitivement clippée dans le domaine de fonctionnement, ou plutôt le domaine de l’entrée de domaine. Par exemple, si l’entrée Foreground est plus grande que l’entrée Background dans le nœud Alpha Over, la sortie sera clippée à l’entrée Background car il s’agit de l’entrée de domaine, comme illustré dans la figure suivante.

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

L’entrée Foreground (premier plan) est plus grande que l’entrée Background (arrière-plan) dans le nœud Alpha Over, donc la sortie est intuitivement clippée à l’entrée Background car elle est l’entrée du domaine.

Le nœud Alpha Over ne prend actuellement pas en charge la modification de la priorité du domaine pour ses entrées, donc en tant que solution de contournement, on peut utiliser un nœud Mix pour atteindre le comportement souhaité, en notant que la première entrée Image dans le nœud Mix a la priorité de domaine la plus élevée, comme montré dans la figure suivante.

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

Travail autour du comportement de clipping du nœud Alpha Over en utilisant un nœud Mix, en notant que la première entrée Image dans le nœud Mix a la priorité de domaine la plus élevée

Pixélisation

Si l’entrée de domaine du nœud est très grande, d’autres entrées seront pixélisées. En effet, la résolution de l’entrée de domaine est la même, tandis que sa taille apparente est considérablement augmentée, donc le nombre de pixels couverts par d’autres entrées est beaucoup moins élevé.

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

Un exemple de cas où la pixélation se produit en raison de très grandes entrées de domaine.

Opérations d’espace de pixels

Les nœuds fonctionnent sur leurs images d’entrée dans l’espace de pixels local, quelle que soit leur transformation dans l’espace de composition. Par exemple, si une image qui est tournée de 90 degrés est floue le long de la direction horizontale à l’aide du nœud Blur, le flou se déroulera apparemment le long de la direction verticale, car le nœud est appliqué dans l’espace pixel local de l’entrée.

Sortie

Le compositeur GPU ne prend en charge qu’une seule cible de sortie active, c’est-à-dire qu’un seul des nœud Composite nodes, nœud Viewer ou nœud Split Viewer dans l’arborescence nœud sera considéré comme actif et le reste ignoré. En particulier, le compositeur recherche le contexte de l’arborescence du nœud actif et retombe dans le contexte de l’arborescence du nœud racine si aucune sortie active n’a été trouvée dans le contexte de l’arborescence du nœud actif. Le contexte de l’arborescence du nœud actif est l’arborescence de nœuds d’un groupe de nœuds élargi, c’est-à-dire lorsque les utilisateurs sélectionnent un nœud de groupe de nœuds et modifient son arborescence sous-jacente, tandis que le contexte de l’arborescence du nœud racine est l’arborescence de nœud de niveau supérieur sans groupe de nœuds développé. Le compositeur recherche le nœud Composite actif, s’il n’en trouve pas, il recherche le nœud Viewer actif, que ce soit un nœud Viewer ou Split Viewer, s’il n’en trouve pas, le compositeur ne fonctionne pas complètement. Par conséquent, notez que l’ajout d’un nœud Viewer n’aura aucun effet s’il y a un nœud Composite, car la priorité est donnée aux nœuds Composite.