Open Shading Language

Cycles Only

C’est aussi possible de créer vos propres nodes en utilisant le Open Shading Language (OSL). Notez que ces nodes fonctionneront seulement dans le rendu CPU : il n’existe pas de prise en charge pour lancer le code OSL sur le GPU.

Pour l’activer, sélectionnez Open Shading Language comme système de shading dans le réglages de rendu.

Script Node

../../_images/render_shader-nodes_osl_script-node.png

Script Node.

OSL a été conçu pour l’ombrage basé sur les nœuds, et chaque shader OSL correspond à un nœud dans une configuration de nœuds. Pour ajouter un shader OSL, ajoutez un node de script et liez-le à un bloc de données textuelles ou à un fichier externe. Les prises d’entrée et de sortie seront créées à partir des paramètres du shader en cliquant sur le bouton de mise à jour dans l’éditeur Node ou Text.

Les OSL shaders peuvent être liés au node de plusieurs manières. Avec le mode Internal, un data-block texte est utilisé pour enregistrer le OSL shader, et le bytecode OSL est enregistré dans le node lui-même. C’est pratique pour distribuer un fichier blend avec le tout empaqueté dedans.

The External mode can be used to specify a .osl file from a drive, and this will then be automatically compiled into a .oso file in the same directory. It is also possible to specify a path to a .oso file, which will then be used directly, with compilation done manually by the user. The third option is to specify just the module name, which will be looked up in the shader search path.

le chemin de recherche du shader est au même emplacement que celui des scripts ou de la configuration, sous :

Linux
$HOME/.config/blender/2.91/shaders/
Windows
C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\2.91\shaders\
macOS
/Users/$USER/Library/Application Support/Blender/2.91/shaders/

Astuce

Pour une utilisation en production, nous suggérons l’utilisation d’un groupe de nodes pour envelopper les script nodes du shader. Ceci permet plus facilement les modifications du node après coup car des sockets sont ajoutés ou supprimés, sans avoir à mettre à jour les script nodes dans tous les fichiers.

Writing Shaders

Pour plus de détails sur l’écriture des shaders, voir les spécifications OSL. ci-après 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 is different from, for example, RSL or GLSL, in that it does not have a light loop. There is no access to lights in the scene, and the material must be built from closures that are implemented in the renderer itself. This is more limited, but also makes it possible for the renderer to do optimizations and ensure all shaders can be importance sampled.

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

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

  • bssrdf_cubic(N, radius, texture_blur, sharpness)

  • bssrdf_gaussian(N, radius, texture_blur)

Volume

  • henyey_greenstein(g)

  • absorption()

Other

  • emission()

  • ambient_occlusion()

  • holdout()

  • background()

Attributes

Some object, particle and mesh attributes are available to the built-in getattribute() function. UV maps and vertex colors can be retrieved using their name. Other attributes are listed below:

geom:generated

Generated texture coordinates.

geom:uv

Default render UV map.

geom:dupli_generated

For instances, generated coordinate from duplicator object.

geom:dupli_uv

For instances, UV coordinate from duplicator object.

geom:trianglevertices

Coordonnées des trois sommets du triangle.

geom:numpolyvertices

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

geom:polyvertices

Vertex coordinates array of the polygon (always three vertices currently).

geom:name

Nom de l’objet.

geom:is_curve

L’objet est-il une mèche ou non.

geom:curve_intercept

Point along the strand, from root to tip.

geom:curve_thickness

Épaisseur de la mèche.

geom:curve_tangent_normal

Normale de la tangente de la mèche.

path:ray_length

Ray distance since last hit.

object:location

Emplacement de l’objet.

object:index

Object index number.

object:random

Per object random number generated from object index and name.

material:index

Material index number.

particle:index

Particle instance number.

particle:age

À ge de la particule en trames.

particle:lifetime

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

particle:location

Location of the particle.

particle:size

Taille de la particule.

particle:velocity

Vitesse de la particule.

particle:angular_velocity

Vitesse angulaire de la particule.

Trace

Nous prenons en charge la fonction trace(point pos, vector dir, ...), pour tracer les rayons du OSL shader. 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 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 la géométrie voisine, par exemple pour appliquer un etexture projetée qui peut être bloquée par la géométrie, appliquez plus de à la géométrie exposée, ou faites d’autres effets de type ambient occlusion.