# Schaduwvolume

Een schaduwvolume is een techniek om schaduwen te renderen in een 3d omgeving. Het was origineel voorgesteld door Frank Crow in 1977, hij beschreef het als het volume in een 3D omgeving die niet zichtbaar is vanuit het standpunt van een lichtbron. Het maakt meestal gebruik van de stencil buffer. Het is een methode welke het mogelijk maakt om real-time schaduwen te renderen. Het algoritme is populair geworden door computer spellen zoals Doom 3, waar een variant wordt gebruikt die bekendstaat als Carmack's reverse.

## Schaduwvolume

Om dit algoritme te gebruiken moet er eerst een 3d model van de geworpen schaduw berekend worden. Hiervoor is veel informatie nodig over het model, namelijk welke vlakken aan elkaar verbonden zijn, welke vlakken naar de lichtbron gericht staan en welke niet, welke lijnen de rand(silhouet) vormen tussen belicht en onbelicht, positie van lichtbron ten opzichte van het model. Een typisch schaduwvolume bestaat uit de belichte vlakken van het model (de voorste afsluiting van het volume) en het silhouet dat geëxtrudeerd wordt van de lichtbron weg. Het volume moet lang genoeg zijn zodat het voorbij het verste object waar het een schaduw op kan werpen kan komen. Soms is het nodig om de achterkant van het volume te sluiten, hiervoor kan je de niet belichte vlakken van het origineel model gebruiken.

## Z-pass

Bij Z-pass (soms depth-pass genoemd) wordt nagegaan op welke plaatsen van het scherm het schaduwvolume door de wereld geometrie gaat. De voorste en achterste vlakken van het schaduwvolume worden afzonderlijk maar niet naar de kleurenbuffer noch naar de dieptebuffer, getekend. Alleen de diepte van het schaduwvolume wordt vergeleken met de waardes die al in de dieptebuffer zitten. Indien een voorste vlak tussen de scène en het camera-standpunt staat, dan wordt de stencilbuffer op die plaats met 1 vermeerderd. Wanneer een achterste vlak tussen de scène en camera-standpunt staat wordt de stencilbuffer met 1 verminderd. Op deze manier wordt er een stencilmask gegenereerd waar de waarde 0 overeenkomt met de belichte delen en de rest zich in de schaduw bevindt. Aan de hand van deze stencilmask kunnen dan delen van de scène opnieuw getekend worden met een aangepaste belichting.
Het nadeel van deze methode is dat ze niet meer werkt wanneer het camerastandpunt zich in het schaduwvolume bevindt. Een manier om dit op te lossen, is eerst controleren of de camera zich in een schaduw bevindt. Bij Z-fail komt dit probleem niet voor.

## Carmack’s reverse

Carmack’s reverse wordt ook wel Z-fail of depth-fail genoemd, het maakt eveneens gebruik van de stencil buffer. Het algoritme is een aanpassing van het Z-pass algoritme, welke fouten geeft wanneer het camerastandpunt zich in de schaduw bevindt.
Het verschil met Z-pass is dat er nu wordt gezien naar de delen van het schaduwvolume achter de wereld geometrie. Indien de voorste vlakken van de schaduw zich achter een object bevinden wordt de stencilbuffer met 1 opgeteld. Bij de achterste vlakken van het schaduwvolume, die zich achter de scène bevinden, wordt er 1 afgetrokken van de stencilbuffer.
Bij deze techniek is het noodzakelijk dat het volume afgesloten is aan de achterkant. Deze afsluiting mag echter niet verder als het verste clipping vlak liggen, anders wordt de afsluiting niet getekend en kan de diepte ervan ook niet vergeleken worden.

## Prestaties

Deze algoritmes zijn in vergelijking met shadowmapping meestal trager. Ze vereisen dat er grote vlakken worden getekend, het vullen van deze vlakken vergt veel tijd. Het berekenen van het silhouet is CPU-intensief, deze berekening is niet nodig voor shadowmapping. Het voordeel van schaduwvolumes is de grotere nauwkeurigheid. Bij shadowmapping is de nauwkeurigheid afhankelijk van de resolutie van de schaduw map, schaduwvolumes zijn tot op de pixel nauwkeurig.