Llenguatge d’aspecció obert

L'Open Shading Language (OSL) és un sistema d’aspecció programable desenvolupat per a motors de revelat avançats. Permet a artistes i desenvolupadores tècniques d’escriure codi d’aspectors personalitzats amb el llenguatge de protocols en C.

A Blender, OSL es pot utilitzar amb Cycles per definir aspectors personalitzats de superfície, volum i desplaçament. Això proporciona als usuaris un control total sobre el comportament aspectiu, tot permetent efectes procedimentals, models d’il·luminació avançats i una lògica de material basada en geometria personalitzada que pot no ser possible només amb els nodes apsectors integrats.

A diferència dels materials basats en nodes, els aspectors OSL es redacten com a protocols textuals d’autora fets amb l'Editor de text els intern de Blender o carregat des de documents externs .osl o .oso. Aquests protocols es compilen després i s’utilitzen a l’Editor d’aspecció mitjançant el Node protocol.

Truc

OSL és especialment útil per generar textures procedimentals, FDDBs personalitzats o implementar prototips de recerca. També permet compartir aspectors en múltiples aplicacions de revelat compatibles que suporten l’estàndard OSL.

Operativa

Per utilitzar l’Open Shading Language (OSL) amb Blender, seguiu aquests passos:

  1. Habiliteu el revelat OSL

    A Propietats de revelat, habiliteu Open Shading Language.

  2. Afegiu un Node protocol

    A l’Editor d’aspecció, afegiu-hi el Node protocol aleshores a les propietats del node:

    • Definiu el Mode com Intern per a utilitzar un bloc de dades de text Blender, o bé

    • Definiu-lo com Extern per carregar un document aspector des del disc (sigui .osl o .oso compilat).

    Per al mode intern, creeu un nou bloc de dades de text a l’Editor de text i, a continuació, escriviu o enganxeu-hi el codi OSL.

    El Blender compilarà automàticament el document d’origen OSL. Si és un osl, es compilarà a bytecode oso.. Els errors de compilació es mostraran a la consola del sistema.

  3. Usar egressions d’aspector

    Un cop compilades, les egressions del node reflectiran els paràmetres de output definits en el codi OSL. Aquestes egressions es poden connectar a qualsevol part de l’arbre de nodes de material.

Redactant aspectors

Per més detalls sobre com formular els aspectors, vegeu la Documentació d’OSL.

Heus aquí un exemple senzill:

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);
}

Tancaments

L’OSL és diferent de, per exemple, RSL o GLSL, en el fet que no té un bucle de llum. No hi ha accés a llums en l’escena i el material ha de ser construït a partir de tancaments que s’implementen en el propi motor de revelat. Això és més limitat, però també fa possible que el revelador faci optimitzacions i s’asseguri que en tots els aspectors s’hi pot mostrejar la importància.

Els tancaments disponibles a Cycles corresponen als nodes aspector i els seus borns; per més detalls sobre el que fan i el significat dels paràmetres, vegeu el manual de nodes aspectors.

Vegeu també

Documentació sobre els tancaments integrats a OSL.

FDDB

  • 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)

Pèl

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

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

  • principled_hair(N, absorción, rugosidad, rugosidad_radial, barniz, desplazamiento, ir)

FBDRSD

S’utilitza per simular la dispersió subsuperficial.

bssrdf(method, N, radius, albedo)
Paràmetres:
  • method (string) – Mètode de revelat per a simular la dispersió subsuperficial. - burley: Una aproximació a la dispersió de volums de base fçisica. Aquest mètode és menys precís que random_walk de tota manera, en algunes situacions aquest mètode farà la resolutiva del soroll més ràpidament. - random_walk_skin: proporciona resultats precisos per a objectes prims i corbats. Circuit aleatori utilitza una dispersió volumètrica real dins de la malla, el que significa que funciona millor per a malles tancades. La superposició de cares i forats a la malla pot causar problemes. random_walk: es comporta de manera similar a random_walk_skin però modula el Radis basant-se en el Color, Anisotropia i IDR. D’aquesta manera, aquest mètode intenta retenir un major detall de la superfície i color que random_walk_skin.

  • N (vector) – Vector de normal del punt de superfície aspectada.

  • radius (vector) – Distància mitjana amb què la llum es dispersa per sota de la superfície. Un radi més alt dona una aparença més suau, ja que la llum sobreïx dins d’ombres i a través de l’objecte. La distància de dispersió s’especifica per separat per als canals RGB, per a revelar materials com la pell, on la llum vermella es dispersa més profundament. Els valors X, Y i Z es mapegen vers als valors R, G i B, respectivament.

  • albedo (color) – Color de la superfície, o físicament parlant, la probabilitat que la llum es reflecteixi per a cada longitud d’ona.

Volum

  • henyey_greenstein(g)

  • absorption()

Altres

  • emission()

  • ambient_occlusion()

  • holdout()

  • background()

Atributs

Els atributs de geometria es poden llegir a través de la funció getattribute(). Això inclou mapes UV, atributs de color i qualsevol egressió d’atributs de nodes de geometria.

Els atributs integrats següents també estan disponibles a través de getattribute().

geom:generated

Coordenades de textura generades automàticament a partir d’una malla no deformada.

geom:uv

Mapa UV per defecte per a revelat.

geom:tangent

Vector tangencial per defecte al llarg de la superfície en l’espai d’objecte.

geom:undisplaced

Posició abans del desplaçament, a l’espai d’objecte.

geom:dupli_generated

Per a instàncies, coordenada generada a partir de l’objecte instanciador.

geom:dupli_uv

Per a instàncies, coordenada UV a partir de l’objecte instanciador.

geom:trianglevertices

Tres coordenades de vèrtex del triangle.

geom:numpolyvertices

Nombre de vèrtexs del polígon (ara per ara, sempre en retorna tres).

geom:polyvertices

Matriu de coordenades de vèrtexs del polígon (ara per ara, sempre en retorna tres).

geom:name

Nom de l’objecte.

geom:is_smooth

ÉS cara de malla d’aspecció suavitzada o aplanada.

geom:is_curve

ÉS l’objecte una corba o no.

geom:curve_intercept

Coordenada 0.1 del al punt al llarg de la corba, des de l’arrel fins a la punta.

geom:curve_thickness

Gruix de la corba en l’espai d’objecte.

geom:curve_length

Longitud de la corba en l’espai d’objecte.

geom:curve_tangent_normal

Normal Tangencial del floc.

geom:is_point

ÉS punt en un núvol de punts o no.

geom:point_radius

Radi del punt en el núvol de punts.

geom:point_position

Posició central del punt en el núvol de punts.

geom:point_random

Nombre aleatori, diferent per a cada punt en el núvol de punts.

path:ray_length

Distància de raig des de l’últim impacte.

object:random

Nombre aleatori, diferent per a cada instància d’objecte.

object:index

Índex d’instància única de l’objecte.

object:location

Ubicació d’objecte.

material:index

Número d’índex únic del material.

particle:index

Número d’instància únic de la partícula.

particle:age

Edat de la partícula en fotogrames.

particle:lifetime

Durada total de la partícula en fotogrames.

particle:location

Ubicació de la partícula.

particle:size

Mida de la partícula.

particle:velocity

Velocitat de la partícula.

particle:angular_velocity

Velocitat angular de la partícula.

Traçar

Només CPU

Donem suport a la funció trace(point pos, vector dir, ...), per a radiotraçar des de l’aspector OSL. El paràmetre «shade» ara mateix no està admès, però els atributs es poden recuperar des de l’objecte que s’ha impactat utilitzant la funció getmessage("trace", ..). Vegeu l’especificació d’OSL per més detalls sobre com utilitzar-ho.

Aquesta funció no es pot utilitzar en lloc de la il·luminació; el principal propòsit és permetre als aspectors de «sondejar» la geometria pròxima, per exemple, per aplicar una textura projectada que pot ser bloquejada per geometria, aplicar més «desgast» a geometria exposada, o fer altres efectes d’estil oclusió ambiental.

Metadades

Les metadades de paràmetres controlen la seva visualització a la interfície d’usuària. S’admeten les entrades següents de metadades:

[[ string label = "My Label" ]]

Nom de visualització personalitzada del paràmetre a la interfície d’usuària.

[[ string widget = "null" ]]

Amaga el paràmetre de la interfície d’usuària.

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

Visualitza un paràmetre enter com una casella de selecció booleana.

[[ string widget = "filename" ]]

Visualitza el paràmetre com un selector de ruta de documents.

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

Mostra un paràmetre enter com un menú enumerat. La cadena opcions defineix una llista de parelles amb valor etiqueta separats per |.

[[ string vecsemantics = "POINT" ]]

Marca un paràmetre vectorial com a ingressió de translació (vector de posició).

[[ string vecsemantics = "NORMAL" ]]

Marca un paràmetre vectorial com a ingressió de normals (vector direccional).

[[ string unit = "radians" ]]

Mara un paràmetre de número de coma flotant com a ingressió d’angle visualitzada en radians.

[[ string unit = "m" ]]

Marca un paràmetre de número de coma flotant com una entrada de distància expressada en metre.

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

Marca un paràmetre de número de coma flotant com una entrada de temps expressada en segons.

Limitacions

Important

L’OSL no és compatible amb el revelat de GPU llevat que s’utilitzi el basament OptiX.

Algunes funcionalitats d’OSL no estan disponibles quan s’utilitza el basament OptiX. En són exemples:

  • Les reduccions d’ús de la memòria que ofereixen funcionalitats com la càrrega de textures a la carta i

    el mip-mapping no estan disponibles.

  • Les consultes de textura requereixen OSL per a poder determinar una ruta constant del document d’imatge constant per a cada

    invocació de textura.

  • Algunes funcions de soroll no estan disponibles. Els exemples inclouen Cel·la, Simplex i Gabor.

  • La funció traçar no està operativa. Com a conseqüència, els nodes Oclusió ambiental i Bisellar no funcionen.