Ouvrir le Shading Language

Open Shading Language (OSL) est un système d’ombrage programmable développé pour les moteurs de rendu avancés. Il permet aux artistes techniques et aux développeurs d’écrire du code shader personnalisé à l’aide d’un langage de script de type C.

Dans Blender, OSL peut être utilisé dans Cycles pour définir des nuanceurs de surface, de volume et de déplacement personnalisés. Cela donne aux utilisateurs un contrôle total sur le comportement de l’ombrage, ce qui permet d’obtenir des effets procéduraux, des modèles d’éclairage avancés et une logique de matériau personnalisée basée sur la géométrie, ce qui n’est peut-être pas possible avec les seuls nœuds de shader intégrés.

Contrairement aux matériaux basés sur des nœuds, les shaders OSL sont créés sous forme de scripts de texte à l’aide de l'éditeur de texte interne de Blender ou chargés à partir de fichiers .osl ou .oso externes. Ces scripts sont ensuite compilés et utilisés dans l’éditeur de shaders via le nœud Script.

Astuce

OSL est particulièrement utile pour générer des textures procédurales, des BRDF personnalisés ou mettre en œuvre des prototypes de recherche. Il permet également de partager des shaders entre des applications de rendu compatibles qui prennent en charge la norme OSL.

Utilisation

Pour utiliser Open Shading Language (OSL) dans Blender, procédez comme suit:

  1. Activer OSL Rendering

    Dans les Render Properties, activer Open Shading Language.

  2. Ajouter un nœud Script

    Dans l’éditeur de shader, ajouter Script Node dans les propriétés du nœud :

    • Réglez le Mode sur Internal pour utiliser un bloc de données de texte Blender, ou

    • Réglez-le sur External pour charger un fichier shader à partir du disque (soit .osl ou .oso compilé).

    Pour le mode interne, créez un nouveau bloc de données texte dans l’éditeur de texte, puis écrivez-y ou collez-y votre code OSL.

    Blender compilera automatiquement le fichier source OSL. Si la source est .osl, elle sera compilée en bytecode .oso. Les erreurs de compilation s’afficheront dans la console système.

  3. Utiliser les sorties du shader

    Une fois compilées, les sorties du nœud refléteront les paramètres output définis dans le code OSL. Ces sorties peuvent être connectées à n’importe quelle partie de l’arborescence des nœuds de matériaux.

Écriture de shaders

Pour plus de détails sur la façon d’écrire des shaders, consultez la Documentation OSL.

Voici un exemple simple :

shader simple_material(
    color Diffuse_Color = color(0.6, 0.8, 0.6),
    float Noise_Factor = 0.5,
    output closure color BSDF = diffuse(N))
{
    color material_color = Diffuse_Color * mix(1.0, noise(P * 10.0), Noise_Factor);
    BSDF = material_color * diffuse(N);
}

Closures

OSL est différent, par exemple, de RSL ou GLSL, en ce qu’il n’a pas de boucle lumineuse. Il n’y a pas d’accès aux lumières dans la scène et le matériau doit être construit à partir de fermetures implémentées dans le moteur de rendu lui-même. Ceci est plus limité, mais permet également au moteur de rendu de faire des optimisations et de garantir que tous les shaders peuvent être échantillonnés de manière importante.

Les closures disponibles dans Cycles correspondent à des nœuds shaders et leurs prises ; pour plus de détail sur leur fonctionnement et la signification des paramètres, voir le manuel des nœuds shaders.

Voir aussi

Documentation sur les closures intégrées d’OSL.

BSDF

  • diffuse(N)

  • oren_nayar(N, roughness)

  • diffuse_ramp(N, colors[8])

  • phong_ramp(N, exponent, colors[8])

  • diffuse_toon(N, size, smooth)

  • glossy_toon(N, size, smooth)

  • translucent(N)

  • reflection(N)

  • refraction(N, ior)

  • transparent()

  • microfacet_ggx(N, roughness)

  • microfacet_ggx_aniso(N, T, ax, ay)

  • microfacet_ggx_refraction(N, roughness, ior)

  • microfacet_beckmann(N, roughness)

  • microfacet_beckmann_aniso(N, T, ax, ay)

  • microfacet_beckmann_refraction(N, roughness, ior)

  • ashikhmin_shirley(N, T, ax, ay)

  • ashikhmin_velvet(N, roughness)

Hair

  • hair_reflection(N, roughnessu, roughnessv, T, offset)

  • hair_transmission(N, roughnessu, roughnessv, T, offset)

  • principled_hair(N, absorption, roughness, radial_roughness, coat, offset, IOR)

BSSRDF

Utilisé pour simuler le subsurface scattering.

bssrdf(method, N, radius, albedo)
Paramètres:
  • method (string) – Méthode de rendu pour simuler la subsurface scattering. - burley: Une approximation de la diffusion de volume basée sur la physique. Cette méthode est moins précise que random_walk, cependant, dans certaines situations, cette méthode résoudra le bruit plus rapidement - random_walk_skin: fournit des résultats précis pour les objets fins et incurvés. Random Walk utilise une véritable diffusion volumétrique à l’intérieur du maillage, ce qui signifie que cela fonctionne mieux pour les maillages fermés. Les faces superposées et les trous dans le maillage peuvent causer des problèmes. - random_walk: se comporte de manière similaire à random_walk_skin mais module le Radius (rayon) en fonction de la Color (couleur), de l'Anisotropy (anisotropie) et de l'IOR (indice de réfraction). Cette méthode tente ainsi de conserver plus de détails et de couleurs de surface que random_walk_skin.

  • N (vector) – Vecteur normal du point de surface ombré.

  • radius (vector) – Distance moyenne à laquelle la lumière se disperse en dessous de la surface. Un rayon plus grand donne une apparence plus douce, la lumière coulant dans les ombres et à travers l’objet. La distance de dispersion est spécifiée à part pour les canaux RGB, pour faire le rendu des matériaux tels que la peau où la lumière rouge se disperse plus profondément. Les valeurs X, Y et Z sont mappées aux valeurs R, G et B respectivement.

  • albedo (color) – Couleur de la surface, ou physiquement parlant, la probabilité que la lumière est réfléchie pour chaque longueur d’onde.

Volume

  • henyey_greenstein(g)

  • absorption()

Autre

  • emission()

  • ambient_occlusion()

  • holdout()

  • background()

Attributes

Les attributs de géométrie peuvent être lus via la fonction getattribute(). Cela inclut les cartes UV, les attributs de couleur et tous les attributs générés par les nœuds géométriques.

Les attributs intégrés suivants sont également disponibles via getattribute().

geom:generated

Coordonnées de texture générées automatiquement, à partir d’un maillage non déformé.

geom:uv

Carte UV de rendu par défaut.

geom:tangent

Vecteur tangent par défaut le long de la surface, dans l’espace objet.

geom:undisplaced

Position avant déplacement, dans l’espace objet.

geom:dupli_generated

Pour les instances, coordonnées générées à partir de l’objet instanceur.

geom:dupli_uv

Pour les instances, coordonnée UV à partir de l’objet instanceur.

geom:trianglevertices

Coordonnées des trois sommets du triangle.

geom:numpolyvertices

Nombre de sommets dans le polygone (retourne actuellement toujours trois).

geom:polyvertices

Tableau de coordonnées des sommets du polygone (toujours trois sommets actuellement).

geom:name

Nom de l’objet.

geom:is_smooth

La face du maillage est-elle lisse ou ombrée à plat.

geom:is_curve

L’objet est-il une courbe ou non.

geom:curve_intercept

Coordonnée 0..1 pour le point le long de la courbe, de la racine à la pointe.

geom:curve_thickness

Épaisseur de la courbe dans l’espace objet.

geom:curve_length

Longueur de la courbe dans l’espace objet.

geom:curve_tangent_normal

Normale de la tangente de la mèche.

geom:is_point

Le point est-il dans un nuage de points ou non.

geom:point_radius

Rayon du point dans un nuage de points.

geom:point_position

Position centrale du point dans le nuage de points.

geom:point_random

Nombre aléatoire, différent pour chaque point du nuage de points.

path:ray_length

Distance du rayon depuis le dernier impact.

object:random

Nombre aléatoire, différent pour chaque instance d’objet.

object:index

Index d’instance unique d’un objet.

object:location

Emplacement de l’objet.

material:index

Numéro d’indice unique du matériau.

particle:index

Numéro d’instance unique de la particule.

particle:age

Àge de la particule en trames.

particle:lifetime

Durée de vie totale de la particule en trames.

particle:location

Position de la particule.

particle:size

Taille de la particule.

particle:velocity

Vitesse de la particule.

particle:angular_velocity

Vitesse angulaire de la particule.

Trace

CPU uniquement

Nous prenons en charge la fonction trace(point pos, vector dir, ...), pour tracer les rayons du shader OSL. Le paramètre “shade” n’est pas pris en charge actuellement, mais les attributs peuvent être récupérés depuis l’objet qui est touché en utilisant la fonction getmessage('trace', ..). Voir les spécifications d’OSL pour les détails d’utilisation.

Cette fonction ne peut pas être utilisée à la place de l’éclairage ; l’objectif principal est de permettre aux shaders de “sonder” la géométrie voisine, par exemple pour appliquer une texture projetée qui peut être bloquée par la géométrie, appliquez plus de “wear” à la géométrie exposée, ou faites d’autres effets de type ambient occlusion.

Metadata

Les métadonnées des paramètres contrôlent la façon dont ils sont affichés dans l’interface utilisateur. Les entrées de métadonnées suivantes sont prises en charge :

[[ string label = "My Label" ]]

Nom d’affichage personnalisé du paramètre dans l’interface utilisateur.

[[ string widget = "null" ]]

Masquer le paramètre dans l’interface utilisateur.

[[ string widget = "boolean" ]] or [[ string widget = "checkbox" ]]

Affiche un paramètre entier sous la forme d’une case à cocher booléenne.

[[ string widget = "filename" ]]

Affiche le paramètre sous la forme d’un sélecteur de chemin d’accès au fichier.

[[ string widget = "mapper", string options = "left:0|right:1" ]]

Affiche un paramètre entier sous la forme d’un menu énuméré. La chaîne options définit une liste de paires étiquette-valeur séparées par |.

[[ string vecsemantics = "POINT" ]]

Marque un paramètre vectoriel en tant qu’entrée de traduction (vecteur de position).

[[ string vecsemantics = "NORMAL" ]]

Marque un paramètre vectoriel comme une entrée normale (vecteur de direction).

[[ string unit = "radians" ]]

Marque un paramètre flottant en tant qu’entrée d’angle, affiché en radians.

[[ string unit = "m" ]]

Marque un paramètre flottant en tant qu’entrée de distance, affiché en mètres.

[[ string unit = "mm" ]]

Marque un paramètre flottant comme entrée de distance, affiché en millimètres.

[[ string unit = "s" ]] or [[ string unit = "sec" ]]

Marque un paramètre flottant comme une entrée de temps, affichée en secondes.

Limitations

Important

OSL n’est pas pris en charge avec le rendu GPU, sauf si vous utilisez le backend OptiX.

Certaines fonctionnalités OSL ne sont pas disponibles lors de l’utilisation du backend Optix. Les exemples comprennent :

  • Les recherches de texture nécessitent que OSL puisse déterminer un chemin de fichier image constant pour chaque

    appel de texture.

  • Certaines fonctions de bruit ne sont pas disponibles. Les exemples incluent Cell, Simplex et Gabor.

  • La fonction trace n’est pas fonctionnelle. En conséquence, les nœuds Ambient Occlusion et Bevel ne fonctionnent pas.