Wat is een OpenGL®-schaduw?
Een Open Graphics Library® (OpenGL®) schaduw is een visuele benadering in een driedimensionale (3D) OpenGL® scène van hoe een schaduw in het echte leven zou worden gegoten onder vergelijkbare lichtomstandigheden. Schaduwen zijn een complexe visuele functie om in OpenGL® te implementeren, voornamelijk omdat er geen aangeboren ondersteuning is voor het werpen van schaduwen in een scène. Er zijn in plaats daarvan een aantal technieken die kunnen worden gebruikt om schaduwen te maken van de objecten en geometrie binnen een scène met behulp van verschillende tools, zoals de verschillende beschikbare buffers, shaders en, in sommige gevallen, extensies die toegang geven tot speciale functies op bepaalde afbeeldingen kaarten. In de meeste gevallen is de kwaliteit, nauwkeurigheid en snelheid van OpenGL®-schaduwweergave direct gerelateerd aan de verwerkingskracht en het geheugen van de grafische hardware in een computer of apparaat. Enkele van de meer populaire methoden voor het implementeren van een OpenGL®-schaduw zijn schaduwvolumes, schaduwmapping en ray tracing.
Het maken van een applicatie met OpenGL®-schaduwondersteuning vereist wiskundige kennis en een diep begrip van hoe OpenGL® werkt. OpenGL® wordt grotendeels gebruikt om 3D-scènes te maken die dynamisch zijn en in realtime worden weergegeven, dus de algoritmen die worden gebruikt om schaduwen te maken, moeten niet alleen worden geoptimaliseerd voor snelheid, maar moeten ook zorgvuldig worden gemeten voor hun verbruik van middelen en eventuele verstoringen die kan worden veroorzaakt in de grafische pipeline die wordt gebruikt voor rendering. Om deze redenen is de meest basale methode voor het maken van een schaduw, ray-tracing genoemd, vaak onpraktisch voor volledige 3D-scènes, omdat het erg lang kan duren.
Ray tracing volgt in principe een denkbeeldige lijn, of straal, van het kijkvlak of de positie van de camera door een scène naar het oppervlak van een object en berekent vervolgens de kleur van het oppervlak op basis van de positie van een of meer lichtbronnen en andere factoren. Tijdens het rasterproces, waarbij de 3D-scène wordt getekend op een tweedimensionaal (2D) oppervlak zodat deze kan worden weergegeven, moet het proces van ray tracing worden uitgevoerd op elke pixel die wordt getekend en, vooral met texturen of andere oppervlakte-eigenschappen, moeten mogelijk dezelfde pixels meerdere keren worden beoordeeld. Dit betekent real-time ray tracing, hoewel het schaduwen nauwkeurig zou weergeven, meestal niet praktisch.
Een andere methode die kan worden gebruikt om een OpenGL®-schaduw te maken, wordt schaduwmapping genoemd. Deze methode gebruikt de diepte- of stencilbuffer om een scène vanuit de hoek van de lichtbron weer te geven als een reeks afstanden van de lichtbron tot de oppervlakken van verschillende objecten in de scène. De scène wordt vervolgens een tweede keer weergegeven vanuit de juiste kijkhoek, waarbij wordt gecontroleerd of elke pixel binnen een bepaald afstandsbereik binnen de buffer valt, wat aangeeft of de pixel verlicht of overschaduwd is. Het gebruik van schaduwmapping kan geheugenintensief zijn en kan bij scènes met meer dan één lichtbron het maken van meerdere kaarten vanuit meerdere hoeken inhouden.
Schaduwvolumes zijn een manier om een OpenGL®-schaduw te maken die nauwkeuriger is dan sommige andere methoden, maar deze heeft zijn eigen problemen. Een schaduwvolume is in wezen een onzichtbaar stukje geometrie in een scène die zich uitbreidt vanaf het verlichte oppervlak van een object weg van de lichtbron. Dit volume kan worden vergeleken met andere objecten om te zien of ze in de schaduw vallen van het oppervlak waaruit het volume is ontstaan. Deze procedure kan zeer complex zijn en uiteindelijk visuele artefacten creëren wanneer deze voor snelheid worden geoptimaliseerd.