Skuggande språk

Ett skuggspråk är ett grafikprogrammeringsspråk anpassat för att programmera skuggningseffekter (karakterisera ytor, volymer och objekt). Sådana språkformer består vanligtvis av speciella datatyper , som "vektor", " matris ", "färg" och " normal ". På grund av mångfalden av målmarknader för 3D-datorgrafik har olika skuggspråk utvecklats.

Offlinerendering

Skuggningsspråk som används vid offline-rendering ger maximal bildkvalitet. Materialegenskaper är helt abstraherade, lite programmeringsförmåga och ingen hårdvarukunskap krävs. Den här typen av shaders utvecklas ofta av konstnärer för att få rätt "look", precis som texturkartläggning, ljussättning och andra aspekter av deras arbete.

Att bearbeta sådana shaders är tidskrävande. Den beräkningskraft som krävs kan vara dyr på grund av deras förmåga att producera fotorealistiska resultat. För det mesta körs produktionsrendering på stora datorkluster .

RenderMan Shading Language

RenderMan Shading Language (ofta refererat till som RSL eller SL, förkortat), som definieras i RenderMan Interface Specification är det vanligaste skuggspråket för rendering av produktionskvalitet. [ citat behövs ] Det är också ett av de första skuggspråken som någonsin implementerats.

Språket definierar sex huvudtyper av shader:

  • Ljuskällshaders beräknar färgen på ljuset som emitteras från en punkt på ljuskällan mot en punkt på målytan.
  • Ytskuggare modellerar de optiska egenskaperna hos ett upplyst objekt. De matar ut punktens slutliga färg och position genom att beakta det inkommande ljuset och objektets fysiska egenskaper.
  • Displacement shaders manipulerar ytgeometrin oberoende av färg.
  • Deformationshaders förvandlar hela utrymmet i en geometri. Endast en RenderMan-implementering, AIR-renderaren från SiTex Graphics, implementerade denna skuggningstyp, och stödde endast en enda linjär transformation som tillämpades på utrymmet (detta var mer som en Transformation shader, om en sådan typ fanns).
  • Volymskuggare manipulerar färgen på ett ljus när det passerar genom en volym. De skapar effekter som dimma .
  • Imager shaders beskriver en färgomvandling till slutliga pixelvärden. Detta är ungefär som ett bildfilter , men bildskuggningen arbetar på data före kvantisering . Sådan data har ett större dynamiskt omfång och färgupplösning än vad som kan visas på en typisk utenhet.

Houdini VEX Shading Language

Houdini VEX (Vector Expressions) skuggspråk (ofta förkortat till "VEX") är nära modellerat efter RenderMan. Dess integration i ett komplett 3D-paket innebär dock att skuggskrivaren kan komma åt informationen inuti skuggningen, en funktion som vanligtvis inte är tillgänglig i ett renderingssammanhang. Språkskillnaderna mellan RSL och VEX är huvudsakligen syntaktiska, förutom skillnader vad gäller namnen på flera shadeop- namn.

Gelato Shading Language

Gelatos skuggspråk, som Houdinis VEX , är nära modellerat efter RenderMan. Skillnaderna mellan Gelato Shading Language och RSL är huvudsakligen syntaktiska — Gelato använder semikolon istället för kommatecken för att separera argument i funktionsdefinitioner och några shadeops har olika namn och parametrar.

Öppna Shading Language

Open Shading Language (OSL) utvecklades av Sony Pictures Imageworks för användning i dess Arnold Renderer. Den används också av Blenders Cycles-renderingsmotor. OSL:s yt- och volymskuggningar definierar hur ytor eller volymer sprider ljus på ett sätt som möjliggör viktig sampling; därför är den väl lämpad för fysiskt baserade renderare som stöder strålspårning och global belysning.

Realtidsrendering

Skuggningsspråk för realtidsrendering är nu utbredda. De ger både högre hårdvaruabstraktion och en mer flexibel programmeringsmodell än tidigare paradigm som hårdkodade transformations- och skuggningsekvationer. Detta ger programmeraren större kontroll över renderingsprocessen och ger rikare innehåll till lägre omkostnader.

Shaders som är designade för att köras direkt på GPU:n blev användbara för allmän bearbetning med hög genomströmning på grund av deras strömprogrammeringsmodell ; detta ledde till utvecklingen av beräkningsskuggare som körs på liknande hårdvara (se även: GPGPU ).

Historiskt sett var det bara ett fåtal sådana språk som lyckades både etablera sig och bibehålla en stark marknadsposition; en kort beskrivning av dessa språk följer nedan.

ARB monteringsspråk

OpenGL Architecture Review Board etablerade assemblerspråket ARB 2002 som ett standardinstruktionsuppsättning på låg nivå för programmerbara grafikprocessorer.

OpenGL- skuggningsspråk på hög nivå kompileras ofta till ARB-sammansättning för laddning och exekvering. Till skillnad från högnivåspråk för skuggning stöder inte ARB-montering kontrollflöde eller förgrening. Den fortsätter dock att användas när portabilitet över GPU krävs.

OpenGL-skuggningsspråk

Även känt som GLSL eller glslang , detta standardiserade skuggspråk är tänkt att användas med OpenGL .

Språket förenar vertex- och fragmentbearbetning i en enda instruktionsuppsättning, vilket tillåter villkorade loopar och (mer allmänt) grenar . Historiskt sett föregicks GLSL av ARB-sammansättningsspråket .

Cg programmeringsspråk

Programmeringsspråket Cg , utvecklat av NVIDIA , har utformats för enkel och effektiv produktionspipelineintegration. Språket har API-oberoende och kommer med ett stort utbud av gratisverktyg för att förbättra tillgångshanteringen. Utvecklingen av Cg stoppades 2012 och språket är nu utfasat.

DirectX Shader Assembly Language

Shader-sammansättningsspråket i Direct3D 8 och 9 är det huvudsakliga programmeringsspråket för vertex- och pixelshaders i Shader Model 1.0/1.1, 2.0 och 3.0. Shader-sammansättningsspråket är en direkt representation av den mellanliggande shader-bytekoden som skickas till grafikdrivrutinen för exekvering.

Shader-sammansättningsspråket kan inte användas direkt för att programmera unified Shader Model 4.0, 4.1, 5.0 och 5.1, även om det behåller sin funktion som en representation av den mellanliggande bytekoden för felsökningsändamål.

DirectX High-Level Shader Language

High -Level Shading Language (även kallat HLSL för kort) är ett C-stil shader-språk för DirectX 9 och högre och Xbox-spelkonsoler. Det är relaterat till Nvidias Cg men stöds endast av DirectX och Xbox. HLSL-program kompileras till bytekod motsvarande DirectX shader assembly-språk.

HLSL introducerades som ett valfritt alternativ till shader-sammansättningsspråket i Direct3D 9, men blev ett krav i Direct3d 10 och högre, där shader-sammansättningsspråket är utfasat.

Adobe Pixel Bender och Adobe Graphics Assembly Language

Adobe Systems lade till Pixel Bender som en del av Adobe Flash 10 API. Pixel Bender kunde bara bearbeta pixel men inte 3D-vertexdata. Flash 11 introducerade ett helt nytt 3D API som heter Stage3D , som använder sitt eget skuggspråk som heter Adobe Graphics Assembly Language (AGAL), som erbjuder fullt stöd för 3D-acceleration. GPU-acceleration för Pixel Bender togs bort i Flash 11.8.

AGAL är ett lågnivå men plattformsoberoende skuggspråk, som till exempel kan kompileras [ citat behövs ] till ARB -sammansättningsspråket eller GLSL .

PlayStation Shader-språk

Sony tillkännagav PSSL ( PlayStation Shader Language ) som ett plattformsspecifikt skuggspråk liknande Cg/HLSL för PlayStation 4 . Den sägs till stor del vara kompatibel med HLSL shaders på PC, men med ytterligare funktioner för PS4-plattformen.

Metal Shading Language

Apple har skapat ett lågnivågrafik-API som heter Metal , som körs på de flesta Mac-datorer som tillverkats sedan 2012, iPhones sedan 5S och iPads sedan iPad Air. Metal introducerar sitt eget skuggspråk som heter Metal Shading Language (MSL), som är baserat på C++14 och implementerat med clang och LLVM . MSL förenar vertex-, fragment- och datorbehandling.

WebGPU Shading Language

WebGPU Shading Language (WGSL) är skuggspråket för WebGPU . Det vill säga, en applikation som använder WebGPU API använder WGSL för att uttrycka programmen, så kallade shaders, som körs på GPU:n.

Översättning

När fler och fler grafik-API:er blir tillgängliga står utvecklare inför problemet med att porta shaders från ett skuggspråk till ett annat. Några metoder används:

  • Manuell växling med C-preprocessor- satser (CPP). Cg/HLSL, GLSL och MSL implementerar alla CPP-makron, så det är möjligt att slå in alla olika operationer i ett gemensamt gränssnitt. Valves Source 2 och NVIDIAs FXAA 3.11 gör detta.
  • Översätt ett språk till det andra. DirectX-bytekod kan delvis konverteras till GLSL via HLSLcc, och flera verktyg för att konvertera GLSL till HLSL som ANGLE och HLSL2GLSL finns.
  • Definiera ett annat mellanspråk. SPIR-V är utformad delvis för detta ändamål. Den kan genereras från HLSL eller GLSL och dekompileras till HLSL, GLSL eller MSL.

Anteckningar

  1. ^ Tidigare vertex-skuggningsspråk (utan särskild ordning) för OpenGL inkluderar EXT_vertex_shader , NV_vertex_program , det tidigare nämnda ARB_vertex_program , NV_vertex_program2 och NV_vertex_program3 .
  2. ^ För fragmentskuggning är nvparse möjligen det första skuggspråket med abstraktion på hög nivå baserat på NV_register_combiners , NV_register_combiners2 för pixelmatte och NV_texture_shader , NV_texture_shader2 och NV_texture_shader3 för texturuppslagningar. ATI_fragment_shader tillhandahöll inte ens en "strängorienterad" analysfunktion (även om den senare har lagts till av ATI_text_fragment_shader ). ARB_fragment_program , har varit mycket framgångsrik. NV_fragment_program och NV_fragment_program2 är faktiskt lika även om det senare ger mycket mer avancerad funktionalitet jämfört med andra.
  3. ^ Fx kompositör från NVIDIAs hemsida, http://developer.nvidia.com/object/fx_composer_home.html
  4.   Rudy Cortes och Saty Raghavachary: The RenderMan Shading Language Guide , Course Technology PTR, 1 upplaga (27 december 2007), ISBN 1-59863-286-8