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 :
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…) :
parent_id
.parent_s
.parent_t
.
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) :
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
.
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 :
st
, les coordonnées locales de l’objet.parent_s/t
, les coordonnées du scalp.
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 :
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
:
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 :
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 :
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 :
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