Shader - Shader

Skuggare används oftast för att producera upplysta och skuggade områden vid återgivning av 3D -modeller . Phong -skuggning (höger) är en förbättring av Gouraud -skuggning och var en av de första dataskärmningsmodellerna som någonsin utvecklats efter den grundläggande plattskärmen (vänster), vilket kraftigt förbättrade utseendet på krökta ytor i renderingar.
En annan användning av shaders är för specialeffekter, även på 2D -bilder, t.ex. ett foto från en webbkamera . Den oförändrade, oskuggade bilden är till vänster och samma bild har en skuggning till höger. Denna skuggning fungerar genom att ersätta alla ljusa områden i bilden med vitt och alla mörka områden med en färgstark konsistens.

I datorgrafik är en skuggare en typ av datorprogram som ursprungligen användes för skuggning i 3D -scener (produktion av lämpliga nivåer av ljus , mörker och färg i en återställd bild). De utför nu en mängd specialiserade funktioner inom olika områden inom kategorin datorgrafik specialeffekter , eller gör video efterbearbetning utan samband med skuggning, eller till och med utför funktioner som inte är relaterade till grafik .

Traditionella shaders beräknar renderingseffekter på grafikhårdvara med hög flexibilitet. De flesta shaders är kodade för (och körs på) en grafikprocessorenhet (GPU), även om detta inte är ett strikt krav. Skuggningsspråk används för att programmera GPU: s återgivningsrörledning , som mestadels har ersatt den tidigare funktionsrörledningen från det förflutna som endast möjliggjorde vanliga geometriomvandlings- och pixelskuggningsfunktioner ; med shaders kan anpassade effekter användas. Den ställning och färg ( nyans , mättnad , ljushet och kontrast ) av alla pixlar , vertex , och / eller texturer används för att konstruera en slutlig renderad bild kan ändras genom att använda algoritmer som definieras i en skuggning, och kan modifieras av externa variabler eller texturer introduceras av datorprogrammet som kallar shader.

Shaders används i stor utsträckning i bio efterbearbetning , datorgenererade bilder och videospel för att producera en rad olika effekter. Utöver enkla belysningsmodeller inkluderar mer komplexa användningsområden för skuggare: att ändra nyans , mättnad , ljusstyrka ( HSL/HSV ) eller kontrast i en bild; producerande oskärpa , ljus blom , volymetriska belysning , normal mapping (för djupeffekter), bokeh , cel-shading , färgreduktion , bump mapping , distorsion , chroma key (för så kallade "bluescreen / greenscreen " effekter), kanten och rörelsedetektor , som liksom psykedeliska effekter som dem som ses i demoscenen .

Historia

Denna användning av termen "shader" introducerades för allmänheten av Pixar med version 3.0 av deras RenderMan Interface Specification, som ursprungligen publicerades i maj 1988.

Som grafikprocessorer utvecklats stora grafikmjukvarubibliotek som OpenGL och Direct3D började stödja shaders. De första grafikprocessorerna med skuggning stödde bara pixelskuggning , men vertex-shaders introducerades snabbt när utvecklare insåg kraften i shaders. Det första grafikkortet med en programmerbar pixelskuggare var Nvidia GeForce 3 (NV20), som släpptes 2001. Geometry shaders introducerades med Direct3D 10 och OpenGL 3.2. Så småningom utvecklades grafikhårdvaran mot en enhetlig skuggmodell .

Design

Shaders är enkla program som beskriver egenskaperna hos antingen en toppunkt eller en pixel . Vertex-shaders beskriver attributen (position, texturkoordinater , färger, etc.) för en hörnpunkt, medan pixel-shaders beskriver egenskaperna (färg, z-djup och alfa- värde) hos en pixel. En vertex shader kallas för varje toppunkt i en primitiv (möjligen efter tessellation ); alltså en hörn in, en (uppdaterad) hörn ut. Varje toppunkt återges sedan som en serie pixlar på en yta (minnesblock) som så småningom kommer att skickas till skärmen.

Shaders ersätter en del av grafikhårdvaran som vanligtvis kallas Fixed Function Pipeline (FFP), så kallad eftersom den utför belysning och texturkartläggning på ett hårdkodat sätt. Shaders ger ett programmerbart alternativ till denna hårdkodade metod.

Den grundläggande grafikrörledningen är följande:

  • CPU: n skickar instruktioner (kompilerade skuggningsspråkprogram ) och geometridata till grafikprocessorenheten, som finns på grafikkortet.
  • Inom vertex -skuggaren transformeras geometrin.
  • Om en geometrisk skuggare är i den grafiska behandlingsenheten och aktiv, utförs vissa ändringar av geometrier i scenen.
  • Om en tessellationsskuggare är i den grafiska behandlingsenheten och aktiv kan geometrier i scenen delas upp .
  • Den beräknade geometrin trianguleras (indelas i trianglar).
  • Trianglar delas upp i fragment quads (ett fragment quad är ett 2 × 2 fragment primitivt).
  • Fragment quads modifieras enligt fragmentskuggaren.
  • Djupprovet utförs; fragment som passerar kommer att skrivas till skärmen och kan blandas in i rambufferten .

Den grafiska pipelinen använder dessa steg för att omvandla tredimensionella (eller tvådimensionella) data till användbara tvådimensionella data för visning. I allmänhet är detta en stor pixelmatris eller " rambuffert ".

Typer

Det finns tre typer av shaders i vanlig användning (pixel-, vertex- och geometri -shaders), med flera nyligen tillagda. Medan äldre grafikkort använder separata bearbetningsenheter för varje shader -typ, har nyare kort enhetliga shaders som kan utföra alla typer av shader. Detta gör att grafikkort kan utnyttja processorkraften mer effektivt.

2D -shaders

2D -shaders verkar på digitala bilder , även kallade texturer inom datorgrafik. De ändrar attribut för pixlar . 2D -skuggare kan delta i att återge 3D -geometri . För närvarande är den enda typen av 2D -skuggare en pixelskuggare.

Pixel shaders

Pixel shaders, även känd som fragment shaders, compute färg och andra attribut för varje "fragment": en enhet för rendering arbete påverkar högst en enda utgångs pixel . De enklaste typerna av pixelskuggare matar ut en skärmpixel som ett färgvärde; mer komplexa shaders med flera ingångar/utgångar är också möjliga. Pixel shaders sträcker sig från att helt enkelt alltid mata ut samma färg, till att tillämpa ett belysningsvärde , till att göra bumpmappning , skuggor , speciella höjdpunkter , genomskinlighet och andra fenomen. De kan ändra djupet på fragmentet (för Z-buffring ) eller mata ut mer än en färg om flera renderingsmål är aktiva. I 3D -grafik kan en pixelskuggare ensam inte producera några typer av komplexa effekter eftersom den bara fungerar på ett enda fragment, utan kunskap om en scenens geometri (dvs. vertexdata). Men pixelskuggare har kunskap om skärmkoordinaten som ritas och kan prova skärmen och pixlar i närheten om innehållet på hela skärmen skickas som en textur till skuggaren. Denna teknik kan möjliggöra en mängd olika tvådimensionella efterbehandlingseffekter som oskärpa , eller kantdetektering /förbättring för tecknade /cel-shaders . Pixel-shaders kan också appliceras i mellanstadier på alla tvådimensionella bilder- sprites eller texturer- i rörledningen , medan vertex-shaders alltid kräver en 3D-scen. Till exempel är en pixelskuggare den enda typen av skuggning som kan fungera som en efterprocessor eller filter för en videoström efter att den har rastrerats .

3D -shaders

3D -shaders fungerar på 3D -modeller eller annan geometri men kan också komma åt färgerna och texturerna som används för att rita modellen eller nätet . Vertex-shaders är den äldsta typen av 3D-skuggare och gör i allmänhet modifieringar per vertex. Nyare geometri -shaders kan generera nya hörn inifrån skuggaren. Tessellation shaders är de nyaste 3D -shadersna; de agerar på partier av hörn på en gång för att lägga till detaljer - som att dela upp en modell i mindre grupper av trianglar eller andra primitiv vid körning, för att förbättra saker som kurvor och stötar eller ändra andra attribut.

Vertex shaders

Vertex -shaders är den mest etablerade och vanliga typen av 3D -skuggare och körs en gång för varje toppunkt som ges till grafikprocessorn. Syftet är att omvandla varje vertexs 3D-position i virtuellt utrymme till 2D-koordinaten där den visas på skärmen (samt ett djupvärde för Z-bufferten). Vertex shaders kan manipulera egenskaper som position, färg och textur koordinater, men kan inte skapa nya hörn. Utgången från vertex -skuggaren går till nästa steg i rörledningen, som antingen är en geometrisk skuggare om den finns eller rastern . Vertex shaders kan möjliggöra kraftfull kontroll över detaljerna om position, rörelse, belysning och färg i alla scener som involverar 3D -modeller .

Geometri skuggare

Geometri -shaders introducerades i Direct3D 10 och OpenGL 3.2; tidigare tillgängligt i OpenGL 2.0+ med användning av tillägg. Denna typ av skuggning kan generera nya grafiska primitiv , såsom punkter, linjer och trianglar, från de primitiver som skickades till början av grafikledningen .

Geometry shader -program körs efter vertex shaders. De tar som input en hel primitiv, möjligen med angränsningsinformation. Till exempel, när man arbetar på trianglar, är de tre hörnen geometriskuggarens ingång. Skuggaren kan sedan avge noll eller fler primitiver, som rastreras och deras fragment till sist överförs till en pixelskuggare .

Typiska användningsområden för en geometrishader inkluderar punkt sprite generation, geometri tessellation , skugga volym extrudering, och enda passering rendering till en kub karta . Ett typiskt verkligt exempel på fördelarna med geometri-shaders skulle vara automatisk maskkomplexitet. En serie linjeremsor som representerar kontrollpunkter för en kurva skickas till geometriskuggaren och beroende på den komplexitet som krävs kan skuggaren automatiskt generera extra linjer som var och en ger en bättre approximation av en kurva.

Tessellationsskuggare

Från och med OpenGL 4.0 och Direct3D 11 har en ny skuggklass som kallas en tessellationsskuggare lagts till. Den lägger till två nya skuggningssteg till den traditionella modellen: tessellationsstyrningshuggare (även kända som skrovskuggare) och tessellationsutvärderingsskuggare (även kända som domänskuggare), som tillsammans möjliggör att enklare maskor kan delas upp i finare maskor vid körning enligt till en matematisk funktion. Funktionen kan relateras till en mängd olika variabler, framför allt avståndet från visningskameran för att möjliggöra aktiv skalning av detaljnivå . Detta gör att objekt nära kameran kan ha fina detaljer, medan längre bort kan de ha mer grova maskor men ändå verka jämförbara i kvalitet. Det kan också drastiskt minska nödvändig nätbandbredd genom att låta maskor förädlas en gång inuti shader -enheterna istället för att sampla mycket komplexa från minnet. Vissa algoritmer kan överträffa valfritt godtyckligt nät, medan andra tillåter "antydan" i maskor för att diktera de mest karakteristiska hörnen och kanterna.

Primitiva och Mesh -shaders

Cirka 2017 lade AMD Vega mikroarkitektur till stöd för ett nytt skuggstadium - primitiva shaders - något som liknar beräkningsskuggare med tillgång till de data som är nödvändiga för att bearbeta geometri. På samma sätt introducerade Nvidia mesh- och task -shaders med sin Turing -mikroarkitektur 2018 som ger liknande funktionalitet och som AMDs primitiva shaders modelleras också efter beräkningsshader.

År 2020 släppte AMD och Nvidia RDNA 2 och Ampere mikroarkitekturer som båda stöder nätskuggning genom DirectX 12 Ultimate . Dessa mesh -shaders tillåter GPU: n att hantera mer komplexa algoritmer, lasta ner mer arbete från CPU: n till GPU: n och i algoritm intensiv återgivning, vilket ökar bildhastigheten eller antalet trianglar i en scen med en storleksordning. Intel meddelade att Intel Arc Alchemist GPU: er som levereras under första kvartalet 2022 kommer att stödja mesh -shaders.

Ray tracing shaders

Ray tracing shaders stöds av Microsoft via DirectX Raytracing , av Khronos Group via Vulkan , GLSL och SPIR-V , av Apple via Metal .

Beräkna shaders

Compute shaders är inte begränsade till grafikprogram, utan använder samma körningsresurser för GPGPU . De kan användas i grafikrörledningar, t.ex. för ytterligare steg i animerings- eller belysningsalgoritmer (t.ex. kaklat framåt rendering ). Vissa återgivnings -API: er gör att beräkningsskuggare enkelt kan dela dataresurser med grafikpipelinen.

Parallell bearbetning

Skuggare skrivs för att tillämpa transformationer på en stor uppsättning element åt gången, till exempel på varje pixel i ett område på skärmen eller för varje toppunkt i en modell. Detta är väl lämpat för parallellbearbetning , och de flesta moderna grafikprocessorer har flera shader -pipelines för att underlätta detta, vilket förbättrar beräkningskapaciteten avsevärt.

En programmeringsmodell med shaders liknar en högre ordningsfunktion för återgivning, att ta shaders som argument och tillhandahålla ett specifikt dataflöde mellan mellanresultat, vilket möjliggör både dataparallellism (över pixlar, hörn etc.) och rörledningsparallellism (mellan steg). (se även kartreducering ).

Programmering

Språket där shaders är programmerade beror på målmiljön. Det officiella OpenGL- och OpenGL ES -skuggningsspråket är OpenGL Shading Language , även känt som GLSL, och det officiella Direct3D -skuggningsspråket är High Level Shader Language , även känt som HLSL. Cg , ett tredjepartsskuggningsspråk som skickar ut både OpenGL- och Direct3D-shaders, utvecklades av Nvidia ; sedan 2012 har den dock skrivits ut. Apple släppte sitt eget skuggningsspråk som kallas Metal Shading Language som en del av Metal -ramverket .

GUI -skuggredigerare

Moderna utvecklingsplattformar för videospel som Unity och Unreal Engine inkluderar alltmer nodbaserade redaktörer som kan skapa shaders utan att behöva koden; användaren presenteras istället med en riktad graf över anslutna noder som tillåter användare att styra olika texturer, kartor och matematiska funktioner till utgångsvärden som den diffusa färgen, den spekulära färgen och intensiteten, grovhet/metallitet, höjd, normal osv. . Automatisk kompilering gör sedan grafen till en verklig, kompilerad skuggare.

Se även

Referenser

Vidare läsning

externa länkar