Nodes Shader

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

Optimisations de nodes

Comme première étape dans le préparation d’un node shader pour exécution, Cycles expand tous les groupes de nodes, comme si l’outil Ungroup, et comme les frames et les nodes reroute.

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

  • Remplacer les nodes 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 nodes 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 nodes 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 nodes no-op Mix RGB (sauf Color Burn, Color Dodge, Lighten, ou Clamp activé), Invert, RGB Curves et Vector Curves avec Factor à zéro.

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

  • Eliminate Bump avec entrée Height constante, en utilisant à la place son entrée Normal ou Geometry Normal.

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

Enfin, les nodes qui ne sont pas connectés directement ou indirectement au node Output sont supprimés.

Optimisations d’exécution

Lors de l’exécution des shaders, une optimisation spéciale est appliquée aux nodes Mix Shader. Si Factor est à 0 ou 1, les nodes 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 de performance de la combinaison de nombreux matériaux dans un shader avec une entrée vector color, texture ou autre entrée utilisée comme interrupteur.

Open Shading Language

Si Open Shading Language est choisi comme back-end de rendu, les nodes 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 nodes 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).