Shader

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 18 april 2018; kontroller kräver 32 redigeringar .

Ordet "shader" har flera betydelser . Den här artikeln beskriver bara en av dem.

Shader ( engelsk  shader  "shading") - ett datorprogram utformat för att köras av grafikkortsprocessorer (GPU) . Shaders är skrivna på ett av de specialiserade programmeringsspråken (se nedan ) och sammanställs till instruktioner för GPU:n.

Applikation

Program som arbetar med tredimensionell grafik och video ( spel , GIS , CAD , CAM , etc.) använder skuggningar för att bestämma parametrarna för geometriska objekt eller bilder, för att ändra bilden (för att skapa effekter av skjuvning, reflektion, brytning , mörkare , med hänsyn till de angivna absorptionsparametrarna och ljusspridning , för att lägga på texturer på geometriska objekt, etc.).

Historik

Tidigare har spelutvecklare implementerat en algoritm för att skapa bilder från geometriska objekt ( rendering ) manuellt: de kompilerade en algoritm för att bestämma de synliga delarna av en scen, kompilerade en algoritm för texturkartläggning och kompilerade algoritmer som skapar icke-standardiserade videoeffekter . För att påskynda ritningen implementerades vissa renderingsalgoritmer på hårdvarunivå - med hjälp av ett grafikkort . Spelutvecklare kunde använda de algoritmer som implementerats av grafikkortet, men kunde inte tvinga grafikkortet att köra sina egna algoritmer, till exempel för att skapa anpassade effekter. Icke-standardiserade algoritmer kördes på den centrala processorn , långsammare (för grafikbearbetningsuppgifter) jämfört med grafikkortets processorer . Låt oss överväga två exempel.

För att lösa problemet började grafikkort lägga till (hårdvaru)algoritmer som efterfrågades av utvecklare. Det stod snart klart att det var omöjligt och opraktiskt att implementera alla algoritmer; beslutade att ge utvecklare tillgång till grafikkortet - för att tillåta GPU -blocken att sättas ihop till godtyckliga pipelines som implementerar olika algoritmer. Program utformade för att köras på processorerna på ett grafikkort kallas "shaders". Speciella språk har utvecklats för att kompilera shaders. Nu laddades inte bara data om geometriska objekt ("geometri"), texturer och annan data som behövs för ritning (avbildning), utan också instruktioner för GPU:n in i grafikkort.

Innan shaders användes användes procedural texturgenerering (till exempel användes i Unreal -spelet för att skapa animerade vatten- och eldtexturer) och multitexturing (skuggningsspråket som användes i Quake 3 -spelet baserades på det ). Dessa mekanismer gav inte samma flexibilitet som shaders.

Med tillkomsten av omkonfigurerbara grafikpipelines blev det möjligt att utföra matematiska beräkningar på GPU ( GPGPU ). De mest välkända GPGPU-mekanismerna är nVidia CUDA , Microsoft DirectCompute och open-source OpenCL , Vulkan från Khronos Group- konsortiet .

Shader typer

Till en början var grafikkort utrustade med flera specialiserade processorer som stödde olika uppsättningar instruktioner . Shaders delades in i tre typer beroende på vilken processor som kör dem (beroende på vilka instruktionsuppsättningar som finns tillgängliga):

Sedan började grafikkort att utrustas med universella processorer (GPU) som stöder instruktionsuppsättningar för alla tre typer av shaders ( de förenade shader-arkitekturen ). Indelningen av shaders i typer har bevarats för att beskriva syftet med en shader. Det blev möjligt att utföra generella beräkningar på GPU:n (inte bara relaterat till datorgrafik), såsom gruvdrift , neurala nätverk .

Vertex shaders

Vertex shadern arbetar på data som är associerade med polyhedron -vertices , såsom vertex (punkt) koordinater i rymden, texturkoordinater, vertexfärg, tangentvektor, binormal vektor, normalvektor. Vertex shadern kan användas för bild- och perspektivtransformation av hörn, för att generera texturkoordinater, för att beräkna belysning, etc.

Exempelkod för en vertex shader i DirectX ASM :

vs.2.0 dcl_position v0 dcl_texcoord v3 m4x4 oPos, v0, c0 mov oT0,v3 Geometriska Shaders

En geometriskuggare, till skillnad från en vertexskuggare, kan bearbeta inte bara en vertex, utan hela primitiva. En primitiv kan vara ett segment (två hörn) och en triangel (tre hörn), och om det finns information om angränsande hörn ( engelska  adjacency ), kan upp till sex hörn bearbetas för en triangulär primitiv. Geometriskuggningen kan generera primitiver i farten (utan att använda CPU).

Geometry shaders användes först på Nvidias grafikkort i 8-serien.

Pixel (fragment) shaders

Pixelskuggningen fungerar med bitmappsfragment och med texturer  - den bearbetar data som är associerade med pixlar (till exempel färg, djup, texturkoordinater). Pixelskuggningen används i det sista skedet av grafikpipelinen för att bilda ett fragment av bilden.

Exempelkod för en pixelshader i DirectX ASM :

ps.1.4 textldr0, t0 mul r0, r0, v0

Fördelar och nackdelar

Fördelar:

  • möjligheten att sammanställa vilka algoritmer som helst (flexibilitet, förenkling och minskning av kostnaden för programutvecklingscykeln, vilket ökar komplexiteten och realismen hos de renderade scenerna);
  • ökning av exekveringshastigheten (jämfört med exekveringshastigheten för samma algoritm som exekveras på den centrala processorn).

Brister:

  • behovet av att lära sig ett nytt programmeringsspråk;
  • förekomsten av olika instruktionsuppsättningar för GPU:er från olika tillverkare.

Programmeringsspråk

För att möta marknadens olika behov (datorgrafik har många applikationer) har ett stort antal shader-programmeringsspråk skapats.

Vanligtvis ger språk för att skriva shaders programmeraren med speciella datatyper (matriser, samplers, vektorer, etc.), en uppsättning inbyggda variabler och konstanter (för att interagera med standard 3D API-funktionalitet).

Professionell rendering

Följande är shader-programmeringsspråk som är fokuserade på att uppnå maximal renderingskvalitet. I sådana språk beskrivs materialens egenskaper med hjälp av abstraktioner. Detta gör att personer som inte har speciella programmeringskunskaper och inte känner till funktionerna i hårdvaruimplementationer kan skriva kod. Till exempel kan konstnärer skriva sådana shaders för att ge "rätt utseende" (texturkartläggning, ljusplacering, etc.).

Vanligtvis är bearbetningen av sådana shaders ganska resurskrävande: att skapa fotorealistiska bilder kräver mycket datorkraft. Vanligtvis görs huvuddelen av beräkningen av stora datorkluster eller bladsystem .

RenderMan Shader-programmeringsspråket implementerat i Pixars RenderMan - programvara var det första shader-programmeringsspråket. RenderMan API , utvecklat av Rob Cook och beskrivet i RenderMan-gränssnittsspecifikationen, är de facto-standarden för professionell rendering, som används under hela Pixars arbete . OSL OSL - engelska.  Open Shading Language [1]  är ett shader-programmeringsspråk utvecklat av Sony Pictures Imageworks [2] som liknar C- språket . Det används i det egenutvecklade Arnold-programmet utvecklat av Sony Pictures Imageworks och avsett för rendering , och i det kostnadsfria programmet Blender [3] avsett för att skapa tredimensionell datorgrafik. Realtidsrendering GLSL GLSL ( Open  GL Shading Language ) [ 4] är ett shader-  programmeringsspråk som beskrivs i OpenGL- standarden och baserat på versionen av C- språket som beskrivs i ANSI C- standarden . Språket stöder de flesta funktionerna i ANSI C, stöder datatyper som ofta används när man arbetar med tredimensionell grafik (vektorer, matriser). Ordet "shader" i GLSL hänvisar till en oberoende kompilerad enhet skriven på det språket. Ordet "program" hänvisar till en uppsättning kompilerade shaders länkade samman. cg Cg ( C for g raphics  ) är ett shader-programmeringsspråk utvecklat av nVidia tillsammans med Microsoft . Språket liknar C och HLSL , utvecklat av Microsoft och ingår i DirectX  9 . Språket använder typerna "int", "float", "halv" ( ett 16-bitars flyttal ). Språket stödjer funktioner och strukturer. Språket har speciella optimeringar i form av "packed arrays" ( engelska packed arrays ): deklarationer som "float a[4]" och "float4 a" motsvarar olika typer; den andra deklarationen skapar en "packad array"; operationer med en "packad array" är snabbare än med en normal. Trots att språket har utvecklats av nVidia kan källkoden kompileras till instruktioner för GPU-grafikkort från ATI . Det bör noteras att alla shader-program har sina egna egenskaper, som kan läras från specialiserade källor.  Shader-programmeringsspråk för DirectX DirectX ASM DirectX ASM är ett lågnivå shader-programmeringsspråk designat för DirectX . Språksyntaxen liknar assemblyspråksyntaxen för x86-processorer . Det finns flera versioner av språket, som skiljer sig från varandra i uppsättningarna av GPU-instruktioner och hårdvarukrav. En vertex shader kan bestå av 100-200 instruktioner. Antalet pixel shader instruktioner är mer begränsat; till exempel, i språkversion 1.4 kan en pixelskuggning inte innehålla fler än 32 instruktioner. HLSL HLSL ( H igh L evel  S hader L anguage ) är ett högnivå shader-programmeringsspråk designat för DirectX och liknar C . Det är ett tillägg för DirectX ASM -språket . Låter dig använda strukturer, procedurer och funktioner.

Anteckningar

  1. Källkod för "oslc"-kompilatorn, "liboslexec"-bibliotek och andra komponenter  (eng.) // github.com . "oslc"-kompilatorn konverterar OSL-koden till mellankod som liknar assemblerspråk . "liboslexec"-biblioteket, med hjälp av LLVM , konverterar mellankoden till inbyggd kod för x86-processorer .
  2. Lista över öppna projekt av Sony Pictures Imageworks  (eng.) // Sony Pictures Imageworks webbplats.
  3. Open Shading Language Arkiverad 17 juni 2015 på Wayback Machine  // Blender User Guide.
  4. Beskrivning av GLSL-språket på opengl.org.

Litteratur

  • Boreskov A. V. OpenGL förlängningar. - BHV-Petersburg, 2005. - ISBN 5-94157-614-5 .
  • Alexey Boreskov. Shader utveckling och felsökning. - BHV-Petersburg, 2006. - ISBN 5-94157-712-5 .
  • "Orange Book" - OpenGL Shading Language av Randi J. Rost, Bill M. Licea-Kane, Dan Ginsburg och John M. Kessenich. ISBN 978-0-321-63763-5

Länkar