GPU Compositor#
Le nouveau compositeur accéléré par GPU introduit dans Blender 3.5 est actuellement utilisé pour la composition de fenêtres.
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.
- Vecteur
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 |
Cible |
Conversion |
---|---|---|
Float |
Vecteur |
f => Vector(f, f, f, 0) |
Float |
Color |
f => Color(f, f, f, 1) |
Vecteur |
Float |
(x, y, z, w) => Moyenne (x, y, z) |
Vecteur |
Color |
(x, y, z, w) => Color(x, y, z, 1) |
Color |
Float |
(r, g, b, a) => Moyenne(r, g, b) |
Color |
Vecteur |
(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.
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.
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 considèrent uniquement la zone des images d’entrée qui chevauchent le domaine opérationnel et ignorent 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.
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.
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.
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.
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.
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.
Output#
Le compositeur GPU ne prend en charge qu’une seule cible de sortie active, c’est-à-dire qu’un seul des Nœuds Composite ou des Nœuds Viewer de l’arborescence des nœuds sera considéré comme actif et le reste sera ignoré. En particulier, le compositeur recherche le contexte de l’arborescence des nœuds actifs (Active Node Tree Context) et revient au contexte de l’arborescence des nœuds racine (Root Node Tree Context) si aucune sortie active n’a été trouvée dans le contexte de l’arborescence des nœuds actifs. Le contexte d’arborescence de nœuds actif est l’arborescence de nœuds d’un groupe de nœuds développé, 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 d’arborescence de nœuds racine est l’arborescence de nœuds de niveau supérieur sans aucun groupe de nœuds développé. Le compositeur recherche le nœud Composite actif, si aucun n’est trouvé, il recherche le nœud Viewer actif, qu’il s’agisse d’un nœud Viewer ou Split Viewer, si aucun n’est trouvé, le compositeur ne s’exécute pas complètement. Par conséquent, notez que l’ajout d’un nœud Viewer n’aura aucun effet s’il existe un nœud Composite, puisque la priorité est donnée aux nœuds Composite.