Notes concernant Yeti

Instances

Yeti permet de créer des instances. La documentation du nœud est disponible ici.

Génération individuelle ou collective

Par défaut, et comparé aux poils qui sont générés en un seul bloc (RiCurves) où chaque poil du bloc dispose du même nombre de segment, les instances sont générées individuellement. Cela veut dire que chaque instance est une géométrie autonome.

Vous pouvez changer ce comportement via le paramètre Generate As dans l’onglet Objects du nœud instance :

Nœud instance generate as combo box

En mode As Instances, Guerilla va générer un groupe de plusieurs points pour chaque source. C’est plus rapide et dispose d’une empreinte mémoire plus faible. En revanche, vous perdez la possibilité de stocker des attributs par instance (tel que les UV du scalp ou les attributs personnalisés). Les attributs par source sont en revanche utilisables.

Propagation des UVs du scalp

Cette technique ne fonctionne pas en mode As Instances.

Dans le cas des poils, les UV du scalp sont correctement propagés. Voici un log Guerilla des attributs d’un fichier .fur de poils Yeti :

03/05/2021 19:13:30 2.30G [02] PROC DIA: RiCurves
03/05/2021 19:13:30 2.30G [02] PROC DIA: P float3[261320] min=(-10.179208,1525.212158,4.068306) max=(-8.482645,1526.793091,6.099504)
03/05/2021 19:13:30 2.30G [02] PROC DIA: P2 float3[261320] min=(-10.180590,1525.215820,4.064013) max=(-8.484012,1526.796997,6.097964)
03/05/2021 19:13:30 2.30G [02] PROC DIA: N float3[32665] min=(-0.999599,-0.999775,-0.999540) max=(0.999807,0.999985,0.999606)
03/05/2021 19:13:30 2.30G [02] PROC DIA: st float2[32665] min=(0.023352,0.017446) max=(2.967126,0.978903)
03/05/2021 19:13:30 2.30G [02] PROC DIA: width float1[261320] min=(0.000010) max=(0.016272)
03/05/2021 19:13:30 2.30G [02] PROC DIA: clumping (float115) float1[32665] min=(0.000000) max=(1.000000)
03/05/2021 19:13:30 2.30G [02] PROC DIA: length (float116) float1[32665] min=(0.000002) max=(0.247378)
03/05/2021 19:13:30 2.30G [02] PROC DIA: dP avg=(-0.001324,0.003827,-0.001617) min=(-0.005023,-0.005981,-0.008006) max=(0.004967,0.007935,0.004561)

Remarquez la présence de st qui correspond aux UV du scalp.

Voici un log Guerilla des attributs d’un fichier .fur d’instance Yeti :

03/05/2021 19:05:57 486M [00] RNDR DIA: RiPointsGeneralPolygons
03/05/2021 19:05:57 486M [00] RNDR DIA: P float3[121] min=(-0.500000,-0.000000,-0.500000) max=(0.500000,0.000000,0.500000)
03/05/2021 19:05:57 486M [00] RNDR DIA: P2 float3[121] min=(-0.500000,-0.000000,-0.500000) max=(0.500000,0.000000,0.500000)
03/05/2021 19:05:57 486M [00] RNDR DIA: N float3[121] min=(0.000000,1.000000,0.000000) max=(0.000000,1.000000,0.000000)
03/05/2021 19:05:57 486M [00] RNDR DIA: st float2[121] min=(0.000000,0.000000) max=(1.000000,1.000000)
03/05/2021 19:05:57 486M [00] RNDR DIA: parent_id (float114) float1[1] min=(7515.000000) max=(7515.000000)
03/05/2021 19:05:57 486M [00] RNDR DIA: parent_t (float115) float1[1] min=(0.221964) max=(0.221964)
03/05/2021 19:05:57 486M [00] RNDR DIA: parent_s (float116) float1[1] min=(2.724847) max=(2.724847)
03/05/2021 19:05:57 486M [00] RNDR DIA: dP avg=(0.000000,0.000000,0.000000) min=(0.000000,0.000000,0.000000) max=(0.000000,0.000000,0.000000)

Ici, les coordonnées st correspondent à celles de la surface de chaque objet. Ce sont les UV de la source d’instance, pas du scalp.

Dans le cas des instances, Yeti génère ces attributs (non documentés…) :

Les deux derniers représentent les UV du scalp sur lequel les instances sont posées.

Pour être exploité dans Guerilla, ces attributs doivent être rassemblés dans un seul vecteur 3D, puis connecté aux coordonnées de texture. Cela se fait via le nœud SL Yeti (Source) :

UV des instances Yeti dans Guerilla

Mais il reste un problème : Dans Maya, l’origine des coordonnées de texture est le coin inférieur gauche, Guerilla suit Renderman, pour qui l’origine des coordonnées de texture sont au coin supérieur gauche. Par défaut, Guerilla décale la coordonnée t sur les géométries (il assume que toutes les primitives proviennent de Maya), mais dans la mesure où parent_t n’est pas st, il n’est pas interprété comme une coordonnée de texture.

Il faut donc décaler sa valeur manuellement en modifiant le contenu du nœud SL Yeti (en double cliquant dessus) de façon à avoir 1-parent_t.

Editor nœud SL Yeti dans Guerilla

Il suffit de remplacer :

parent_t = primattr ("parent_t", 0);

Par :

parent_t = 1 - primattr ("parent_t", 0);

Si votre texture est connectée à la DiffuseColor, chaque instance prendra la valeur de couleur de la texture suivant leur positionnement sur le scalp. Vous pouvez alors utiliser ces deux coordonnées UV pour affiner votre lookdev :

Propagation des attributs personnalisés

Yeti permet de créer des attributs par instance via le nœud Attribute (documentation disponible ici). Ces attributs peuvent être utilisés à l’intérieur du graph Yeti, mais également passé au moteur de rendu. Par défaut, les instances n’exportent aucun attribut personnalisé. Pour pouvoir récupérer un attribut personnalisé au rendu, un ensemble d’opérations sont nécessaires. Voici un graph simple :

Graph attributs personnalisé sur des instances

Le nœud super_attribute ajoute un attribut au graph et le nœud instance0 est la sortie du graph.

Le nœud super_attribute créé un attribut my_super_attr :

Attribut my_super_attr

Si on exporte le .fur comme tel, l’attribut ne sera pas propagé et donc, non disponible pour Guerilla. Il faut cocher la case Map As Renderable Attribute :

Case à cocher Map As Renderable Attribute

Si vous avez déjà réussi à exploité des attributs personnalisés dans des poils, vous le savez sûrement déjà.

La dernière étape, spécifique aux instances, est d’ajouter le nom de l’attribut au champ Inherited Attributes :

Nœud instance onglet Objects paramètres Inherited Attributes

L’attribut my_super_attr sera alors correctement envoyé à chaque instance, comme le prouve le log de shape Guerilla :

03/05/2021 19:40:30 972M [10] RNDR DIA: RiPointsGeneralPolygons
03/05/2021 19:40:30 972M [10] RNDR DIA: P float3[121] min=(-0.500000,-0.000000,-0.500000) max=(0.500000,0.000000,0.500000)
03/05/2021 19:40:30 972M [10] RNDR DIA: P2 float3[121] min=(-0.500000,-0.000000,-0.500000) max=(0.500000,0.000000,0.500000)
03/05/2021 19:40:30 972M [10] RNDR DIA: N float3[121] min=(0.000000,1.000000,0.000000) max=(0.000000,1.000000,0.000000)
03/05/2021 19:40:30 972M [10] RNDR DIA: st float2[400] min=(0.000000,0.000000) max=(1.000000,1.000000)
03/05/2021 19:40:30 972M [10] RNDR DIA: parent_id (float114) float1[1] min=(7514.000000) max=(7514.000000)
03/05/2021 19:40:30 972M [10] RNDR DIA: parent_t (float115) float1[1] min=(0.375987) max=(0.375987)
03/05/2021 19:40:30 972M [10] RNDR DIA: parent_s (float116) float1[1] min=(1.848639) max=(1.848639)
03/05/2021 19:40:30 972M [10] RNDR DIA: my_super_attr (color16) float3[1] min=(1.000000,2.000000,0.000000) max=(1.000000,2.000000,0.000000)
03/05/2021 19:40:30 972M [10] RNDR DIA: dP avg=(0.000000,0.000000,0.000000) min=(0.000000,0.000000,0.000000) max=(0.000000,0.000000,0.000000)

Cette technique fonctionne en mode As Instances, mais ne permet que de propager les attributs de la source. Par exemple :

Graph attributs personnalisé sur des instances sur la souce et les points

Dans le graph ci-dessus, l’attribut défini dans point_attribute ne sera pas propagé, en revanche l’attribut défini dans source_attribute sera correctement propagé.

Dernière mise à jour : sam. 06 mars 2021