Vad är en OpenGL® Shadow?

En Open Graphics Library® (OpenGL®) skugga är en visuell approximation i en tredimensionell (3D) OpenGL®-scen av hur en skugga skulle kastas i verkligheten under liknande ljusförhållanden. Skuggor är en komplex visuell funktion att implementera i OpenGL®, till stor del för att det inte finns något medfött stöd för att kasta skuggor i en scen. Det finns istället en mängd olika tekniker som kan användas för att skapa skuggor från objekten och geometrin i en scen med hjälp av olika verktyg, såsom de olika tillgängliga buffertarna, shaders och, i vissa fall, tillägg som ger tillgång till specialfunktioner på viss grafik kort. I de flesta fall är kvaliteten, noggrannheten och hastigheten för OpenGL®-skuggåtergivning direkt relaterad till processorkraften och minnet hos grafikhårdvaran som finns i en dator eller enhet. Några av de mer populära metoderna för att implementera en OpenGL®-skugga inkluderar skuggvolymer, skuggkartering och strålspårning.

Att skapa en applikation som har OpenGL®-skuggstöd kräver matematiska kunskaper och en djup förståelse för hur OpenGL® fungerar. OpenGL® används till stor del för att skapa 3D-scener som är dynamiska och renderade i realtid, så algoritmerna som används för att skapa skuggor måste inte bara optimeras för hastighet, utan måste också noggrant mätas för deras förbrukning av resurser och eventuella störningar som kan orsakas i den grafikpipeline som används för rendering. Av dessa skäl är den mest grundläggande metoden för att skapa en skugga, kallad ray tracing, ofta opraktisk för hela 3D-scener, eftersom det kan ta mycket lång tid.

Strålspårning följer i princip en imaginär linje, eller stråle, från betraktningsplanet eller kamerans position genom en scen till ett objekts yta och beräknar sedan färgen på ytan baserat på positionen för en eller flera ljuskällor och andra faktorer. Under rastreringsprocessen, där 3D-scenen ritas till en tvådimensionell (2D) yta så att den kan visas, måste strålspårningsprocessen utföras på varje pixel som ritas och, särskilt med texturer eller andra ytegenskaper, kan behöva bedöma samma pixlar flera gånger. Detta innebär att strålspårning i realtid, även om det skulle återge skuggor korrekt, vanligtvis inte är praktiskt.

En annan metod som kan användas för att skapa en OpenGL®-skugga kallas skuggmappning. Denna metod använder djup- eller stencilbufferten för att återge en scen från ljuskällans vinkel som en serie avstånd från ljuskällan till ytorna på olika objekt inom scenen. Scenen renderas sedan en andra gång från rätt betraktningsvinkel och kontrollerar om varje pixel faller inom ett visst avståndsområde inom bufferten, vilket indikerar om pixeln är upplyst eller skuggad. Att använda skuggmappning kan vara minneskrävande och, med scener som har mer än en ljuskälla, kan det innebära att man gör flera kartor från flera vinklar.

Skuggvolymer är ett sätt att skapa en OpenGL®-skugga som är mer exakt än vissa andra metoder, men den ger sina egna problem. En skuggvolym är i huvudsak ett osynligt stycke geometri i en scen som expanderar från den upplysta ytan på ett objekt bort från ljuskällan. Denna volym kan kontrolleras mot andra föremål för att se om de faller i skuggan av den yta som volymen härstammar från. Denna procedur kan vara mycket komplex och i slutändan skapa visuella artefakter när den är optimerad för hastighet.