Öppet skuggningsspråk

open Shading Language (OSL) <https://github.com/AcademySoftwareFoundation/OpenShadingLanguage>`__ är ett programmerbart skuggningssystem som utvecklats för avancerade renderingsmotorer. Det gör det möjligt för tekniska konstnärer och utvecklare att skriva anpassad shaderkod med hjälp av ett C-liknande skriptspråk.

I Blender kan OSL användas inom Cycles för att definiera anpassade yt-, volym- och förskjutningsskuggor. Detta ger användarna full kontroll över skuggningsbeteendet, vilket möjliggör procedureffekter, avancerade belysningsmodeller och anpassad geometribaserad materiallogik som kanske inte är möjlig med enbart inbyggda shader-noder.

Till skillnad från nodbaserade material skapas OSL-shaders som textskript med hjälp av Blenders interna Text Redigerare eller laddas från externa .osl- eller .oso-filer. Dessa skript sammanställs sedan och används i Shader Redigerare genom Script Node.

Tips

OSL är särskilt användbart för att generera procedurella texturer, anpassade BRDF:er eller för att implementera forskningsprototyper. Det gör det också möjligt att dela shaders mellan kompatibla renderingsprogram som stöder OSL-standarden.

Användning

Följ dessa steg för att använda Open Shading Language (OSL) i Blender:

  1. Aktivera OSL-rendering

    I Render Properties aktivera Open Shading Language.

  2. Lägg till en skriptnod

    I Shader Redigerare lägger du till Script Node och sedan i nodens egenskaper:

    • Ställ in Mode till Internal för att använda ett Blender-textdatablock, eller

    • Ställ in den på External för att ladda en shader-fil från disken (antingen .osl eller kompilerad .oso).

    För det interna läget skapar du ett nytt textdatablock i Textredigeraren och skriver eller klistrar sedan in din OSL-kod där.

    Blender kommer att kompilera OSL-källfilen automatiskt. Om källan är .osl, kommer den att kompileras till .oso bytecode. Kompileringsfel kommer att visas i systemkonsolen.

  3. Använda Shader-utgångar

    När noden har kompilerats kommer dess utgångar att återspegla de parametrar för ”utgångar” som definierats i OSL-koden. Dessa utgångar kan anslutas till valfri del av materialets nodträd.

Skriva shaders

För mer information om hur du skriver shaders, se OSL Documentation.

Här följer ett enkelt exempel:

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

Stängningar

OSL skiljer sig från t.ex. RSL eller GLSL genom att det inte har någon ljusloop. Det finns ingen tillgång till lampor i scenen, och materialet måste byggas från closures som implementeras i själva renderaren. Detta är mer begränsat, men gör det också möjligt för renderaren att göra optimeringar och se till att alla shaders kan samplas på ett viktigt sätt.

De tillgängliga stängningarna i Cycles motsvarar shader-noderna och deras socklar; för mer information om vad de gör och parametrarnas betydelse, se shader nodes manual.

Se även

Dokumentation om OSL:s inbyggda stängningar.

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, grovhet)

  • microfacet_ggx_aniso(N, T, ax, ay)

  • microfacet_ggx_refraktion(N, grovhet, ior)

  • microfacet_beckmann(N, grovhet)

  • microfacet_beckmann_aniso(N, T, ax, ay)

  • microfacet_beckmann_refraktion(N, grovhet, ior)

  • ashikhmin_shirley(N, T, ax, ay)

  • ashikhmin_velvet(N, strävhet)

Hår

  • hår_reflektion(N, grovhetu, grovhetv, T, offset)

  • hår_transmission(N, grovhetu, grovhetv, T, offset)

  • principled_hair(N, absorption, råhet, radiell_råhet, beläggning, offset, IOR)`

BSSRDF

Används för att simulera spridning under markytan.

bssrdf(method, N, radius, albedo)
Parametrar:
  • method (string) – Renderingsmetod för att simulera spridning under markytan. - burley: En approximation av fysikaliskt baserad volymspridning. Denna metod är mindre exakt än random_walk men i vissa situationer kommer denna metod att lösa brus snabbare. - random_walk_skin: Ger korrekta resultat för tunna och krökta objekt. Random Walk använder äkta volymetrisk spridning inuti nätet, vilket innebär att den fungerar bäst för slutna nät. Överlappande ytor och hål i nätet kan orsaka problem. - random_walk: Uppför sig på samma sätt som random_walk_skin men modulerar Radius baserat på Color, Anisotropy och IOR. Denna metod försöker därmed behålla större ytdetaljer och färg än random_walk_skin.

  • N (vector) – Normalvektor för den ytpunkt som skuggas.

  • radius (vector) – Genomsnittligt avstånd som ljuset sprids under ytan. Högre radie ger ett mjukare utseende, eftersom ljuset blöder in i skuggor och genom objektet. Spridningsavståndet anges separat för RGB-kanalerna för att återge material som hud där rött ljus sprids djupare. X-, Y- och Z-värdena mappas till R-, G- respektive B-värdena.

  • albedo (color) – Ytans färg, eller rent fysiskt, sannolikheten för att ljus reflekteras för varje våglängd.

Volym

  • henyey_greenstein(g)

  • absorption()

Annan

  • emission()

  • ambient_occlusion()

  • holdout()`

  • background()

Attribut

Geometriattribut kan läsas genom funktionen getattribute(). Detta inkluderar UV-kartor, färgattribut och alla attribut som matas ut från geometriska noder.

Följande inbyggda attribut är också tillgängliga via getattribute().

geom:generated

Automatiskt genererade texturkoordinater, från icke-deformerat nät.

geom:uv

Standard UV-karta för rendering.

geom:tangent

Standard tangentvektor längs ytan, i objektrymden.

geom:undisplaced

Position före förflyttning, i objektrymden.

geom:dupli_generated

För instanser, genererad koordinat från instancerobjekt.

geom:dupli_uv

För exempel, UV-koordinat från instanceringsobjekt.

geom:trianglevertices

Tre toppkoordinater för triangeln.

geom:numpolyvertices

Antal hörn i polygonen (returnerar alltid tre för närvarande).

geom:polyvertices

Array med polygonens vertexkoordinater (alltid tre vertexar för närvarande).

geom:name

Objektets namn.

geom:is_smooth

Är nätytan slät eller platt skuggad.

geom:is_curve

Är objektet en kurva eller inte.

geom:curve_intercept

0..1 koordinat för punkt längs kurvan, från rot till spets.

geom:curve_thickness

Kurvans tjocklek i objektrymden.

geom:curve_length

Kurvans längd i objektrymden.

geom:curve_tangent_normal

Tangent Normal för strängen.

geom:is_point

Är punkten i ett punktmoln eller inte.

geom:point_radius

Radie för punkt i punktmolnet.

geom:point_position

Centrumposition för punkt i punktmolnet.

geom:point_random

Slumpmässigt nummer, olika för varje punkt i punktmolnet.

path:ray_length

Rayavstånd sedan senaste träff.

object:random

Slumpmässigt nummer, olika för varje objektinstans.

object:index

Objektets unika instansindex.

object:location

Objektets placering.

material:index

Materialets unika indexnummer.

particle:index

Partikelns unika instansnummer.

particle:age

Partikelns ålder i bildrutor.

particle:lifetime

Total livslängd för partikel i bildrutor.

particle:location

Partikelns placering.

particle:size

Partikelns storlek.

particle:velocity

Partikelns hastighet.

particle:angular_velocity

Partikelns vinkelhastighet.

Spåra

Enbart CPU

Vi stöder funktionen trace(point pos, vector dir, …) för att spåra strålar från OSL-shadern. Parametern ”shade” stöds inte för närvarande, men attribut kan hämtas från objektet som träffades med hjälp av funktionen getmessage(”trace”, …). Se OSL-specifikationen för detaljer om hur du använder detta.

Den här funktionen kan inte användas i stället för belysning; huvudsyftet är att göra det möjligt för shaders att ”undersöka” närliggande geometri, till exempel för att applicera en projicerad textur som kan blockeras av geometri, applicera mer ”slitage” på exponerad geometri eller göra andra ambient occlusion-liknande effekter.

Metadata

Metadata för parametrar styr hur de visas i användargränssnittet. Följande metadata stöds:

[[ string label = ”Min etikett” ]]`

Namn på parameter i användargränssnittet

[[ string widget = ”null” ]]`

Dölj parameter i användargränssnittet.

[[ string widget = ”boolean” ]] och [[ string widget = ”checkbox” ]]

Visa heltalsparametern som en boolesk kryssruta.

Begränsningar

Viktigt

OSL stöds inte med GPU-rendering om inte OptiX-backend används.

Vissa OSL-funktioner är inte tillgängliga när du använder OptiX backend. Exempel på detta är:

  • Minskad minnesanvändning tack vare funktioner som texturladdning på begäran och

    mip-mapping är inte tillgängliga.

  • Texturuppslagningar kräver att OSL kan bestämma en konstant bildfilssökväg för varje

    textur samtal.

  • Vissa brusfunktioner är inte tillgängliga. Exempel på sådana är Cell, Simplex och Gabor.

  • Funktionen trace är inte funktionell.

    Som ett resultat av detta fungerar inte noderna Ambient Occlusion och Bevel.