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:
Activer OSL Rendering
Dans les , activer Open Shading Language.
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.
Utiliser les sorties du shader
Une fois compilées, les sorties du nœud refléteront les paramètres
outputdé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 querandom_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_skinmais 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 querandom_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:generatedCoordonnées de texture générées automatiquement, à partir d’un maillage non déformé.
geom:uvCarte UV de rendu par défaut.
geom:tangentVecteur tangent par défaut le long de la surface, dans l’espace objet.
geom:undisplacedPosition avant déplacement, dans l’espace objet.
geom:dupli_generatedPour les instances, coordonnées générées à partir de l’objet instanceur.
geom:dupli_uvPour les instances, coordonnée UV à partir de l’objet instanceur.
geom:triangleverticesCoordonnées des trois sommets du triangle.
geom:numpolyverticesNombre de sommets dans le polygone (retourne actuellement toujours trois).
geom:polyverticesTableau de coordonnées des sommets du polygone (toujours trois sommets actuellement).
geom:nameNom de l’objet.
geom:is_smoothLa face du maillage est-elle lisse ou ombrée à plat.
geom:is_curveL’objet est-il une courbe ou non.
geom:curve_interceptCoordonné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_lengthLongueur de la courbe dans l’espace objet.
geom:curve_tangent_normalNormale de la tangente de la mèche.
geom:is_pointLe point est-il dans un nuage de points ou non.
geom:point_radiusRayon du point dans un nuage de points.
geom:point_positionPosition centrale du point dans le nuage de points.
geom:point_randomNombre aléatoire, différent pour chaque point du nuage de points.
path:ray_lengthDistance du rayon depuis le dernier impact.
object:randomNombre aléatoire, différent pour chaque instance d’objet.
object:indexIndex d’instance unique d’un objet.
object:locationEmplacement de l’objet.
material:indexNuméro d’indice unique du matériau.
particle:indexNuméro d’instance unique de la particule.
particle:ageÀge de la particule en trames.
particle:lifetimeDurée de vie totale de la particule en trames.
particle:locationPosition de la particule.
particle:sizeTaille de la particule.
particle:velocityVitesse de la particule.
particle:angular_velocityVitesse 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.