Skygge

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 18. april 2018; checks kræver 32 redigeringer .

Ordet "shader" har flere betydninger . Denne artikel beskriver kun én af dem.

Shader ( engelsk  shader  "shading") - et computerprogram designet til at blive udført af grafikkortprocessorer (GPU) . Shaders er skrevet på et af de specialiserede programmeringssprog (se nedenfor ) og kompileret til instruktioner til GPU'en.

Ansøgning

Programmer, der arbejder med tredimensionel grafik og video ( spil , GIS , CAD , CAM , osv.) bruger shaders til at bestemme parametrene for geometriske objekter eller billeder, for at ændre billedet (for at skabe effekter af forskydning, refleksion, brydning , mørkning , under hensyntagen til de specificerede absorptionsparametre og lysspredning , for at pålægge teksturer på geometriske objekter osv.).

Historie

Tidligere implementerede spiludviklere en algoritme til at skabe billeder fra geometriske objekter ( gengivelse ) manuelt: de kompilerede en algoritme til at bestemme de synlige dele af en scene, kompilerede en algoritme til teksturkortlægning og kompilerede algoritmer, der skaber ikke-standard videoeffekter . For at fremskynde tegningen blev nogle gengivelsesalgoritmer implementeret på hardwareniveau - ved hjælp af et videokort . Spiludviklere kunne bruge algoritmerne implementeret af videokortet, men kunne ikke tvinge videokortet til at udføre sine egne algoritmer, for eksempel for at skabe brugerdefinerede effekter. Ikke-standardalgoritmer blev udført på den centrale processor , langsommere (til grafikbehandlingsopgaver) sammenlignet med processorerne på videokortet . Lad os overveje to eksempler.

For at løse problemet begyndte videokort at tilføje (hardware) algoritmer efterspurgt af udviklere. Det blev hurtigt klart, at det var umuligt og upraktisk at implementere alle algoritmerne; besluttede at give udviklere adgang til videokortet - for at tillade GPU -blokkene at blive samlet til vilkårlige pipelines, der implementerer forskellige algoritmer. Programmer designet til at køre på processorerne på et videokort kaldes "shaders". Der er udviklet specielle sprog til kompilering af shaders. Nu blev ikke kun data om geometriske objekter ("geometri"), teksturer og andre nødvendige data til tegning (billeddannelse), men også instruktioner til GPU'en indlæst på videokort.

Forud for brugen af ​​shaders blev proceduremæssig teksturgenerering brugt (for eksempel brugt i Unreal -spillet til at skabe animerede vand- og ildteksturer) og multiteksturering (shader-sproget, der blev brugt i Quake 3 -spillet, var baseret på det ). Disse mekanismer gav ikke den samme fleksibilitet som shaders.

Med fremkomsten af ​​rekonfigurerbare grafiske pipelines blev det muligt at udføre matematiske beregninger på GPU'en ( GPGPU ). De mest kendte GPGPU-mekanismer er nVidia CUDA , Microsoft DirectCompute og open-source OpenCL , Vulkan fra Khronos Group- konsortiet .

Shader typer

Til at begynde med var videokort udstyret med flere specialiserede processorer , der understøttede forskellige sæt instruktioner . Shaders blev opdelt i tre typer afhængigt af hvilken processor der vil udføre dem (afhængigt af hvilke instruktionssæt der er tilgængelige):

Derefter begyndte videokort at blive udstyret med universelle processorer (GPU'er), der understøtter instruktionssæt af alle tre typer shaders ( de forenede shader-arkitekturen ). Opdelingen af ​​shaders i typer er bevaret for at beskrive formålet med en shader. Det blev muligt at udføre generelle beregninger på GPU'en (ikke kun relateret til computergrafik), såsom minedrift , neurale netværk .

Vertex shaders

vertex shaderen opererer på data forbundet med polyhedron toppunkter , såsom toppunkt (punkt) koordinater i rummet, tekstur koordinater, toppunkt farve, tangent vektor, binormal vektor, normal vektor. Vertex shaderen kan bruges til udsigts- og perspektivtransformation af toppunkter, til generering af teksturkoordinater, til beregning af belysning osv.

Eksempelkode for en vertex shader i DirectX ASM :

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

En geometriskygger er, i modsætning til en vertex shader, i stand til at behandle ikke kun et toppunkt, men hele primitivet. En primitiv kan være et segment (to toppunkter) og en trekant (tre toppunkter), og hvis der er information om tilstødende toppunkter ( engelsk  adjacency ), kan op til seks toppunkter behandles til en trekantet primitiv. Geometriskyggeren er i stand til at generere primitiver på farten (uden at bruge CPU'en).

Geometri shaders blev først brugt på Nvidias 8-serie grafikkort.

Pixel (fragment) shaders

Pixelshaderen arbejder med bitmapfragmenter og med teksturer  - den behandler data forbundet med pixels (for eksempel farve, dybde, teksturkoordinater). Pixel-shaderen bruges i det sidste trin af grafikpipelinen til at danne et fragment af billedet.

Eksempelkode for en pixel shader i DirectX ASM :

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

Fordele og ulemper

Fordele:

  • muligheden for at kompilere alle algoritmer (fleksibilitet, forenkling og reduktion af omkostningerne ved programudviklingscyklussen, øge kompleksiteten og realismen af ​​de gengivne scener);
  • stigning i eksekveringshastighed (sammenlignet med udførelseshastigheden af ​​den samme algoritme, der udføres på den centrale processor).

Fejl:

Programmeringssprog

For at imødekomme markedets forskellige behov (computergrafik har mange applikationer) er der blevet skabt et stort antal shader-programmeringssprog.

Normalt giver sprog til skrivning af shaders programmøren specielle datatyper (matricer, samplere, vektorer osv.), et sæt indbyggede variabler og konstanter (til at interagere med standard 3D API-funktionalitet).

Professionel gengivelse

Følgende er shader-programmeringssprog, der er fokuseret på at opnå maksimal gengivelseskvalitet. I sådanne sprog beskrives materialers egenskaber ved hjælp af abstraktioner. Dette gør det muligt for folk, der ikke har særlige programmeringsevner og ikke kender funktionerne i hardwareimplementeringer, at skrive kode. For eksempel kan kunstnere skrive sådanne shaders for at give "det rigtige look" (teksturkortlægning, lysplacering osv.).

Normalt er behandlingen af ​​sådanne shaders ret ressourcekrævende: at skabe fotorealistiske billeder kræver meget computerkraft. Typisk udføres hovedparten af ​​databehandlingen af ​​store computerklynger eller blade-systemer .

RenderMan Shader-programmeringssproget implementeret i Pixars RenderMan - software var det første shader-programmeringssprog. RenderMan API'et , udviklet af Rob Cook og beskrevet i RenderMan-grænsefladespecifikationen, er de facto-standarden for professionel gengivelse, der bruges gennem hele Pixars arbejde . OSL OSL - engelsk.  Open Shading Language [1]  er et shader-programmeringssprog udviklet af Sony Pictures Imageworks [2] , der ligner C -sproget . Det bruges i det proprietære Arnold-program udviklet af Sony Pictures Imageworks og beregnet til gengivelse , og i det gratis program Blender [3] beregnet til at skabe tredimensionel computergrafik. Realtidsgengivelse GLSL GLSL ( Open GL Shading Language ) [ 4] er et shader - programmeringssprog   beskrevet i OpenGL -standarden og baseret på versionen af ​​C -sproget beskrevet i ANSI C -standarden . Sproget understøtter de fleste funktioner i ANSI C, understøtter datatyper , der ofte bruges, når man arbejder med tredimensionel grafik (vektorer, matricer). Ordet "shader" i GLSL refererer til en uafhængigt kompileret enhed skrevet på det sprog. Ordet "program" refererer til et sæt kompilerede shaders, der er knyttet sammen. cg Cg ( C for g raphics  ) er et shader programmeringssprog udviklet af nVidia sammen med Microsoft . Sproget ligner C og HLSL , udviklet af Microsoft og inkluderet i DirectX  9 . Sproget bruger typerne "int", "float", "halv" ( et 16-bit flydende kommatal ). Sproget understøtter funktioner og strukturer. Sproget har ejendommelige optimeringer i form af "packed arrays" ( engelsk packed arrays ): erklæringer som "float a[4]" og "float4 a" svarer til forskellige typer; den anden erklæring skaber et "pakket array"; operationer med en "pakket array" er hurtigere end med en normal. På trods af at sproget er udviklet af nVidia, kan kildekoden kompileres til instruktioner til GPU-skærmkort fra ATI . Det skal bemærkes, at alle shader-programmer har deres egne karakteristika, som kan læres fra specialiserede kilder.  Shader-programmeringssprog til DirectX DirectX ASM DirectX ASM er et lav-niveau shader programmeringssprog designet til DirectX . Sprogsyntaksen ligner assemblysprogsyntaks for x86-processorer . Der er flere versioner af sproget, der adskiller sig fra hinanden i sæt af understøttede GPU-instruktioner og hardwarekrav. En vertex shader kan bestå af 100-200 instruktioner. Antallet af pixel shader instruktioner er mere begrænset; for eksempel, i sprogversion 1.4, må en pixel shader ikke indeholde mere end 32 instruktioner. HLSL HLSL ( High L evel  S hader Sprog ) er et højniveau shader-programmeringssprog designet til DirectX og ligner C. Det er en tilføjelse til DirectX ASM -sproget . Giver dig mulighed for at bruge strukturer, procedurer og funktioner.

Noter

  1. Kildekode til "oslc"-kompileren, "liboslexec"-biblioteker og andre komponenter  (eng.) // github.com . "oslc"-kompileren konverterer OSL-koden til mellemkode, der ligner assemblersprog . "liboslexec"-biblioteket ved hjælp af LLVM konverterer mellemkoden til native kode for x86-processorer .
  2. Liste over åbne projekter af Sony Pictures Imageworks  (eng.) // Sony Pictures Imageworks websted.
  3. Open Shading Language Arkiveret 17. juni 2015 på Wayback Machine  // Blender User Guide.
  4. Beskrivelse af GLSL-sproget på opengl.org.

Litteratur

  • Boreskov A. V. OpenGL udvidelser. - BHV-Petersburg, 2005. - ISBN 5-94157-614-5 .
  • Alexey Boreskov. Shader udvikling og debugging. - BHV-Petersburg, 2006. - ISBN 5-94157-712-5 .
  • "Orange Book" - OpenGL Shading Language af Randi J. Rost, Bill M. Licea-Kane, Dan Ginsburg og John M. Kessenich. ISBN 978-0-321-63763-5

Links