Les nœuds Shader

Cycles applique un grand nombre d’optimisations de nœud shader à la fois au moment de la compilation et de l’exécution. En les exploitant il est possible de concevoir des groupes de nœuds complexes du style “Uber Shader” qui occasionnent un coût de temps de rendu minimal pour les fonctions inutilisées.

Optimisations de nœuds

Comme première étape dans le préparation d’un nœud shader pour exécution, Cycles expand tous les groupes de nœuds, comme si l’outil Ungroup, et comme les frames et les nœuds reroutés.

Après cela, il applique certaines transformations évidentes. Par exemple, il peut (la liste n’est pas exhaustive) :

  • Remplacer les nœuds suivants par le résultat constant de leur évaluation, si toutes leurs entrées sont déterminées comme étant constantes :

    RGB, Value, Mix RGB, Math, Vector Math, RGB to BW, Gamma, Bright Contrast, Invert, Separate/Combine RGB/XYZ/HSV, Blackbody, RGB Curves, Vector Curves, Color Ramps.

  • Détecter les nœuds Mix RGB, Math et Vector Math qui deviennent no-op (sans Clamp) ou qui sont à 0 suite à une addition, une soustraction, une multiplication, une division ou un produit scalaire/vectoriel avec une constante connue de 0 ou 1 en entrée, et les remplacer par le lien d’entrée ou le résultat constant approprié.

  • Éliminer les nœuds Mix RGB Mix (sans Clamp) et Mix Shader lorsque Factor est à 0 ou 1 en le remplaçant par la valeur d’entrée ou le lien approprié.

  • Éliminer les nœuds no-op Mix RGB (sauf Color Burn, Color Dodge, Lighten, ou Clamp activé), Invert, RGB Curves et Vector Curves avec Factor à zéro.

  • Les nœuds Shader Eliminate Emission et Background qui n’émettent aucune lumière, et les nœuds Add Shader avec un ou deux arguments d’entrée manquants.

  • Éliminer le Bump avec une entrée Height constante, en utilisant à la place son entrée Normal ou Geometry Normal. C’est utile pour implémenter des entrées de groupe de nœuds qui sont par défaut sur normal via le routage via un Bump sans opération avant de faire des calculs.

  • Combiner plusieurs copies du même nœud avec les mêmes entrées en une seule instance.

Enfin, les nœuds qui ne sont pas connectés directement ou indirectement au nœud Output sont supprimés.

Optimisations d’exécution

Lors de l’exécution des shaders, une optimisation spéciale est appliquée aux nœuds Mix Shader. Si Factor est à 0 ou 1, les nœuds qui ne sont accessibles que par la branche inutilisée du mix ne sont pas évalués.

Ceci peut substantiellement réduire le coût des performances de la combinaison de nombreux matériaux dans un shader avec un attribut de couleur, une texture ou une autre entrée utilisée comme commutateur.

Ouvrir le Shading Language

Si Open Shading Language est choisi comme back-end de rendu, les nœuds shaders sont traduits en code OSL puis compilés et exécutés par le runtime OSL. Au cours de ce processus, il applique son propre vaste ensemble d’optimisations, tant à la compilation qu’à l’exécution.

L’Open Shading Language peut optimiser les nœuds Script si leurs sorties sont inutilisées ou constantes, même si leurs shaders OSL ont des effets indésirables comme le traçage de débogage et la transmission de messages, ce qui peut être déroutant. Pour cette raison, les messages transmis avec``setmessage`` et getmessage ne doivent généralement pas être utilisés pour transmettre des informations dans le graphique ; il est préférable de transmettre explicitement les informations par des connecteurs (sockets).