Ö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:
Aktivera OSL-rendering
I
aktivera Open Shading Language.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.
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.