Techniques courantes pour améliorer les mappages de profondeur d’ombre
Les cartes d’ombres, introduites pour la première fois en 1978, sont une technique courante pour ajouter des ombres aux jeux. Trois décennies plus tard, malgré les avancées matérielles et logicielles, les artefacts d’ombre , à savoir les bords scintilleux, les alias de perspective et d’autres problèmes de précision, persistent.
Cet article technique fournit une vue d’ensemble de certains algorithmes courants de carte de profondeur d’ombre et d’artefacts courants, et explique plusieurs techniques (allant de la difficulté de base à intermédiaire) qui peuvent être utilisées pour améliorer la qualité des mappages d’ombres standard. L’ajout de shadow maps de base à un titre est généralement simple, mais il peut être difficile de comprendre les nuances des artefacts d’ombre. Cet article technique est écrit pour le développeur graphique intermédiaire qui a implémenté des ombres, mais ne comprend pas entièrement pourquoi des artefacts spécifiques apparaissent et ne sait pas comment les contourner.
La sélection des techniques appropriées pour atténuer des artefacts spécifiques n’est pas une méthode dérivée. Lorsque les lacunes de la carte fantôme sont résolues, la différence de qualité peut être impressionnante (Figure 1). L’implémentation correcte de ces techniques améliore considérablement les ombres standard. Les techniques décrites dans cet article sont implémentées dans l’exemple CascadedShadowMaps11 du Kit de développement logiciel (SDK) DirectX.
Figure 1. Ombres avec artefacts graves (à gauche) et ombres après l’implémentation des techniques décrites dans cet article (à droite)
Révision des cartes de profondeur d’ombre
L’algorithme de carte de profondeur d’ombre est un algorithme à deux passes. La première passe génère une carte de profondeur dans l’espace lumineux. Dans la deuxième passe, cette carte est utilisée pour comparer la profondeur de chaque pixel dans l’espace lumineux à sa profondeur correspondante dans la carte de profondeur de l’espace lumineux.
Figure 2 : Parties clés d’une scène d’ombre
Passe 1
La scène est illustrée dans la figure 2. Dans la première passe (Figure 3), la géométrie est rendue dans une mémoire tampon de profondeur du point de vue de la lumière. Plus précisément, le nuanceur de vertex transforme la géométrie en espace d’affichage de la lumière.
Le résultat final de cette première passe est une mémoire tampon de profondeur contenant les informations de profondeur de la scène du point de vue de la lumière. Vous pouvez maintenant l’utiliser à la passe 2 pour déterminer les pixels qui sont exclus de la lumière.
Figure 3. Premier passage du mappage de clichés instantanés de base
Passe 2
Dans la deuxième passe (Figure 4), le nuanceur de vertex transforme chaque sommet deux fois. Chaque sommet est transformé en espace d’affichage de l’appareil photo et transmis au nuanceur de pixels en tant que position. Chaque sommet est également transformé par la matrice vue-projection-texture de la lumière et passé au nuanceur de pixels en tant que coordonnée de texture. La matrice view-projection-texture est la même matrice que celle utilisée pour restituer la scène dans la passe 1 avec une transformation supplémentaire. Il s’agit d’une transformation qui met à l’échelle et traduit les points de l’espace de vue (–1 à 1 dans X et Y) en espace de texture (0 à 1 dans X et 1 à 0 dans Y).
Le nuanceur de pixels reçoit la position interpolée et les coordonnées de texture interpolées. Tout ce qui est nécessaire pour effectuer le test de profondeur se trouve désormais dans cette coordonnée de texture. Le test de profondeur peut maintenant être effectué en indexant la mémoire tampon de profondeur de la première passe avec les coordonnées de texture X et Y et en comparant la valeur de profondeur résultante à la coordonnée de texture Z.
Figure 4. Deuxième passage du mappage d’ombres de base
Artefacts de shadow map
L’algorithme de carte de profondeur d’ombre est l’algorithme d’ombre en temps réel le plus couramment utilisé, mais il produit toujours plusieurs artefacts nécessitant une atténuation. Les types d’artefacts qui peuvent se produire sont résumés ci-dessous.
Alias de perspective
L’alias de perspective, un artefact courant, est illustré à la figure 5. Elle se produit lorsque le mappage de pixels dans l’espace d’affichage aux texels dans le shadow map n’est pas un ratio un-à-un. Cela est dû au fait que les pixels proches du plan proche sont plus proches les uns des autres et nécessitent une résolution de carte d’ombres plus élevée.
La figure 6 montre une carte d’ombres et un frustum de vue. Près de l’œil, les pixels sont plus proches les uns des autres et de nombreux pixels sont mappés aux mêmes texels d’ombre. Les pixels par le plan lointain sont répartis, ce qui réduit l’alias de perspective.
Figure 5. Alias de perspective élevée (à gauche) et alias de perspective basse (à droite)
Pour l’image à gauche, l’alias de perspective est plus élevé ; trop de pixels d’espace oculaire sont mappés aux mêmes texels de carte d’ombre. Dans l’image de droite, l’alias de perspective est faible, car il existe un mappage 1:1 entre les pixels d’espace oculaire et les texels de carte d’ombre.
Figure 6. Afficher le frustum avec une carte d’ombres
Les pixels légers dans le plan lointain représentent l’alias de perspective basse, et les pixels sombres dans le plan proche représentent l’alias de perspective élevée.
La résolution de la carte fantôme peut également être trop élevée. Bien qu’une résolution plus élevée soit moins visible, elle peut néanmoins entraîner des objets de petite taille, tels que des fils téléphoniques, et ne pas projeter d’ombres. En outre, une résolution trop élevée peut entraîner de graves problèmes de performances en raison des modèles d’accès aux textures.
Les cartes d’ombres de perspective (PSM) et les cartes d’ombre d’espace clair (LSPSM) tentent de traiter l’alias de perspective en faisant pencher la matrice de projection de la lumière afin de placer plus de texels près de l’œil là où ils sont nécessaires. Malheureusement, aucune technique n’est en mesure de résoudre l’alias de perspective. Le paramétrage de la transformation nécessaire pour mapper des pixels d’espace oculaire à des texels dans le shadow map ne peut pas être lié par une asymétrie linéaire. Un paramétrage logarithmique est requis. Les PSM placent trop de détails près de l’œil, ce qui provoque des ombres distantes de faible qualité ou même de disparaître. Les LSPSM font un meilleur travail pour trouver un juste milieu entre l’augmentation de la résolution près de l’œil et le fait de laisser suffisamment de détails pour les objets éloignés. Les deux techniques dégénèrent en ombres orthographiques dans certaines configurations de scène. Cette dégénération peut être compensée par le rendu d’une carte d’ombres distincte pour chaque face du frustum de la vue, bien que cela soit coûteux. Les cartes d’ombres de perspective logarithmique (LogPSMs) affichent également une carte distincte par face du frustum de la vue. Cette technique utilise la rastérisation non linéaire pour placer plus de texels près de l’œil. Le matériel de classe D3D10 et D3D11 ne prend pas en charge la rastérisation non linéaire. Pour plus d’informations sur ces techniques et algorithmes, consultez la section Références.
Les cartes d’ombres en cascade (CSM) sont la technique la plus populaire pour gérer les alias de perspective. Bien que les CSM puissent être combinés avec des modules PSM et LSPSM, cela n’est pas nécessaire. L’utilisation de CSM pour corriger les erreurs d’alias de perspective est traitée dans l’article complémentaire Cartes d’ombres en cascade.
Alias projectif
L’alias projectif est plus difficile à afficher que l’alias de perspective. Les ombres distenues mises en surbrillance dans la figure 7 illustrent des erreurs d’alias projectives. L’alias projectif se produit lorsque le mappage entre les texels dans l’espace de la caméra et les texels dans l’espace lumineux n’est pas un ratio un-à-un; cela est dû à l’orientation de la géométrie par rapport à la caméra de lumière. L’alias projectif se produit lorsque le plan tangent de la géométrie devient parallèle aux rayons lumineux.
Figure 7. Alias à haute projection et alias faiblement projectif
Les techniques utilisées pour atténuer les erreurs d’alias de perspective atténuent également l’alias projectif. L’alias projectif se produit lorsque la normale de surface est orthogonale à la lumière ; ces surfaces devraient recevoir moins de lumière en fonction des équations d’éclairage diffus.
Acné d’ombre et Self-Shadowing erronées
L’acné d’ombre (Figure 8), un terme synonyme d’auto-ombre erronée, se produit lorsque la carte d’ombres quantifie la profondeur sur un texel entier. Lorsque le nuanceur compare une profondeur réelle à cette valeur, il est aussi susceptible d’être ombré que d’être masqué.
Une autre raison pour l’acné d’ombre est que le texel dans l’espace de lumière est si proche de la profondeur du texel correspondant dans la carte de profondeur que les erreurs de précision provoquent l’échec erroné du test de profondeur. L’une des raisons de cette différence de précision est que la carte de profondeur a été calculée par le matériel de rastérisation à fonction fixe, tandis que la profondeur comparée a été calculée par le nuanceur. L’alias projectif peut également causer l’acné d’ombre.
Figure 8. Artefact d’acné d’ombre
Comme le montre l’image de gauche, certains pixels ont échoué au test de profondeur et ont créé des artefacts mouchetés et des modèles moiré. Afin de réduire l’auto-ombre erronée, les limites du plan proche et du plan lointain pour le frustum de vue de l’espace lumineux doivent être calculées aussi étroitement que possible. Le biais de profondeur basé sur l’échelle de pente et d’autres types de biais sont d’autres solutions utilisées pour atténuer l’acné d’ombre.
Peter Panoramique
Le terme Peter Panning dérive son nom d’un personnage de livre pour enfants dont l’ombre s’est détachée et qui pouvait voler. Cet artefact fait apparaître les objets avec des ombres manquantes comme étant détachés de et à flotter au-dessus de la surface (Figure 9).
Figure 9. Artefact Peter Panning
Dans l’image à gauche, l’ombre est détachée de l’objet, créant un effet flottant.
Une technique pour enlever l’acné de surface consiste à ajouter une valeur à la position des pixels dans l’espace clair; c’est ce qu’on appelle l’ajout d’un décalage de profondeur. Peter Panoramique se produit lorsque le décalage de profondeur utilisé est trop grand. Dans ce cas, le décalage de profondeur entraîne la réussite du test de profondeur par erreur. Comme l’acné d’ombre, Peter Panning est aggravé quand la précision de la mémoire tampon de profondeur est insuffisante. Calculer des plans proches serrés et des plans éloignés permet également d’éviter Peter Panning.
Techniques pour améliorer les shadow maps
L’ajout d’ombres à un titre est un processus. La première étape consiste à faire fonctionner les shadow maps de base. La deuxième consiste à s’assurer que tous les calculs de base sont effectués de manière optimale : frusta fit aussi étroitement que possible, plans proches/lointains s’ajustent étroitement, biais à l’échelle de la pente est utilisé, et ainsi de suite. Une fois que les ombres de base sont activées et qu’elles semblent aussi bien que possible, le développeur a une meilleure idée des algorithmes nécessaires pour obtenir les ombres suffisamment fidèles. Vous trouverez dans cette section des conseils de base qui peuvent être nécessaires pour obtenir des cartes de ombres de base qui examinent leur meilleur.
biais de profondeur Slope-Scale
Comme mentionné précédemment, l’auto-ombre peut entraîner l’acné de l’ombre. L’ajout d’une trop grande partialité peut entraîner peter panning. De plus, les polygones avec des pentes abruptes (par rapport à la lumière) souffrent plus d’alias projectif que de polygones avec des pentes peu profondes (par rapport à la lumière). Pour cette raison, chaque valeur de carte de profondeur peut nécessiter un décalage différent en fonction de la pente du polygone par rapport à la lumière.
Le matériel Direct3D 10 a la possibilité de biaiser un polygone en fonction de sa pente par rapport au sens de la vue. Cela a pour effet d’appliquer un grand biais à un polygone qui est affiché en bordure de la direction de la lumière, mais pas d’appliquer de biais à un polygone face à la lumière directement. La figure 10 montre comment deux pixels voisins peuvent alterner entre ombre et non éclipsé lors d’un test sur la même pente impartiale.
Figure 10. Biais de profondeur mis à l’échelle de la pente par rapport à la profondeur non biaisée
Calcul d’une projection serrée
L’adaptation étroite de la projection de la lumière au frustum de vue augmente la couverture de la carte d’ombres. La figure 11 montre que l’utilisation d’une projection arbitraire ou l’ajustement de la projection aux limites de la scène entraîne un alias de perspective plus élevé.
Figure 11. Frustum d’ombre arbitraire et frustum d’ombre s’adaptent à la scène
La vue est du point de vue de la lumière. Le trapézoïde représente le frustum de la caméra de vue. La grille dessinée sur l’image représente le shadow map. L’image à droite montre que la même carte de ombres de résolution crée plus de couverture de texel lorsqu’elle est plus étroitement adaptée à la scène.
La figure 12 illustre les frustums qui sont correctement adaptés. Pour calculer la projection, les huit points qui composent le frustum de vue sont transformés en espace clair. Ensuite, les valeurs minimale et maximale en X et Y sont trouvées. Ces valeurs constituent les limites d’une projection orthographique.
Figure 12 : Ajustement de projection d’ombre pour afficher frustum
Il est également possible de couper le frustum à la scène AABB pour obtenir une limite plus étroite. Cela n’est pas recommandé dans tous les cas, car cela peut changer la taille de la projection de la caméra lumineuse d’un cadre à l’autre. De nombreuses techniques, telles que celles décrites dans la section Déplacement de la lumière Texel-Sized incréments, donnent de meilleurs résultats lorsque la taille de la projection de la lumière reste constante dans chaque image.
Calcul du plan proche et du plan lointain
Le plan proche et le plan lointain sont les derniers éléments nécessaires pour calculer la matrice de projection. Plus les plans sont rapprochés, plus les valeurs de la mémoire tampon de profondeur sont précises.
La mémoire tampon de profondeur peut être 16 bits, 24 bits ou 32 bits, avec des valeurs comprises entre 0 et 1. En règle générale, les tampons de profondeur sont des points fixes, les valeurs proches du plan proche étant regroupées plus étroitement que les valeurs proches du plan lointain. Le degré de précision disponible pour la mémoire tampon de profondeur est déterminé par le rapport entre le plan proche et le plan lointain. L’utilisation du plan proche/lointain le plus serré possible pourrait permettre l’utilisation d’une mémoire tampon de profondeur de 16 bits. Une mémoire tampon de profondeur 16 bits peut réduire l’utilisation de la mémoire tout en augmentant la vitesse de traitement.
AABB-Based plan proche et plan lointain
Un moyen simple et naïf de calculer le plan proche et le plan lointain consiste à transformer le volume englobant de la scène en espace clair. La plus petite valeur de coordonnée Z est le plan proche et la plus grande valeur de coordonnée Z est le plan lointain. Pour de nombreuses configurations de la scène et de la lumière, cette approche est suffisante. Le pire scénario, cependant, peut entraîner une perte significative de précision dans la mémoire tampon de profondeur ; La figure 13 illustre un tel scénario. Ici, la plage du plan proche au plan lointain est quatre fois plus grande que nécessaire.
Le frustum d’affichage de la figure 13 a été volontairement choisi pour être petit. Une petite vue frustum est montrée dans une très grande scène composée de piliers qui s’étendent de la caméra de vue. L’utilisation de l’AABB de scène pour les plans proche et lointain n’est pas optimale. L’algorithme CSM décrit dans l’article technique Cascaded Shadow Maps doit calculer des plans proches et lointains pour de très petits frustums.
Figure 13 : Plans proches et lointains basés sur Scene AABB
Frustum-Based plan proche et plan lointain
Une autre technique pour calculer les plans proche et lointain consiste à transformer le frustum en espace clair et à utiliser les valeurs minimales et maximales de Z comme plans proche et lointain, respectivement. La figure 14 illustre les deux problèmes liés à cette approche. Tout d’abord, le calcul est trop conservateur, comme le montre quand le frustum s’étend au-delà de la géométrie de la scène. Deuxièmement, le plan proche pourrait être trop serré, entraînant le rognage des roulettes d’ombre.
Figure 14. Plans proches et lointains basés uniquement sur le frustum de vue
Frustum clair croisé avec scène pour calculer des plans proches et lointains
La façon appropriée de calculer les plans proche et lointain est illustrée à la figure 15. Quatre des plans du frustum lumineux orthographique ont été calculés à l’aide des coordonnées minimales et maximales X et Y du frustum de vue dans l’espace clair. Les deux derniers plans du frustum de vue orthogonale sont les plans proche et lointain. Pour trouver ces plans, les limites de la scène sont coupées par rapport aux quatre plans frustum légers connus. Les valeurs Z les plus petites et les plus grandes de la limite nouvellement rognée représentent respectivement le plan proche et le plan lointain.
Le code qui effectue cette opération se trouve dans l’exemple CascadedShadowMaps11. Les huit points qui composent l’AABB du monde sont transformés en espace lumineux. La transformation des points en espace clair simplifie les tests de découpage. Les quatre plans connus du frustum léger peuvent maintenant être représentés sous forme de lignes. Les scènes englobant le volume dans l’espace lumineux peuvent être représentées sous la forme de six quadrilatères. Ces 6 quadrilatères peuvent ensuite être transformés en 12 triangles pour le découpage en triangle. Les triangles sont coupés sur les plans connus du frustum de vue (il s’agit de lignes horizontales et verticales dans X et Y dans l’espace clair). Lorsqu’un point d’intersection est trouvé dans X et Y, le triangle 3D est coupé à ce point. Les valeurs Z minimales et maximales de tous les triangles coupés sont le plan proche et le plan lointain. L’exemple CascadedShadowMaps11 montre comment effectuer cette découpage dans la fonction ComputeNearAndFar .
Il existe deux autres techniques qui pourraient être utilisées pour calculer les plans les plus proches et lointains possibles. Ces techniques ne sont pas indiquées dans l’exemple CascadedShadowMaps.
Même des plans proches et lointains plus serrés peuvent être calculés en croisant une hiérarchie d’une scène ou d’objets individuels dans une scène contre le frustum léger. Cela serait plus complexe du point de travail. Bien qu’elle ne soit pas illustrée dans l’exemple CascadedShadowMaps11, cette technique peut être valide pour certaines vignettes.
Le plan lointain peut être calculé en prenant le minimum de :
- La plus grande profondeur du frustum de vue dans l’espace lumineux.
- La plus grande profondeur de l’intersection du frustum de vue et de la scène AABB.
Cette approche peut être problématique lorsqu’elle est utilisée avec des cartes d’ombres en cascade où il est possible d’indexer en dehors d’un frustum de vue. Dans ce cas, la géométrie de la carte fantôme est peut-être manquante.
Figure 15. Plans proches et lointains basés sur l’intersection des quatre plans calculés du frustum léger et de la géométrie englobante de la scène
Déplacement de la lumière dans Texel-Sized incréments
Un artefact courant dans les cartes d’ombres est l’effet de bord scintillement. À mesure que la caméra se déplace, les pixels le long des bords des ombres s’égayent et s’assombrient. Cela ne peut pas être vu dans les images fixes, mais il est très visible et distrayant en temps réel. La figure 16 met en évidence ce problème et la figure 17 montre à quoi doivent ressembler les bords d’ombre.
L’erreur de bord scintillement se produit parce que la matrice de projection de lumière est recalculée chaque fois que la caméra se déplace. Cela crée des différences subtiles dans les cartes d’ombres générées. Tous les facteurs suivants peuvent influencer la matrice créée pour lier la scène.
- Taille du frustum de vue
- Orientation du frustum de la vue
- Emplacement de la lumière
- Emplacement de la caméra
Chaque fois que cette matrice change, les bords des ombres peuvent changer.
Figure 16. Bords d’ombre chatoyants
Les pixels le long de la bordure de l’ombre entrent et sortent de l’ombre à mesure que la caméra se déplace de gauche à droite.
Figure 17. Ombres sans bords chatoyants
Les bords d’ombre restent constants lorsque la caméra se déplace de gauche à droite.
Pour les lumières directionnelles, la solution à ce problème consiste à arrondir la valeur minimale/maximale en X et Y (qui composent les limites de projection orthographique) à des incréments de taille de pixels. Cela peut être effectué avec une opération de division, une opération de plancher et une multiplication.
vLightCameraOrthographicMin /= vWorldUnitsPerTexel;
vLightCameraOrthographicMin = XMVectorFloor( vLightCameraOrthographicMin );
vLightCameraOrthographicMin *= vWorldUnitsPerTexel;
vLightCameraOrthographicMax /= vWorldUnitsPerTexel;
vLightCameraOrthographicMax = XMVectorFloor( vLightCameraOrthographicMax );
vLightCameraOrthographicMax *= vWorldUnitsPerTexel;
La valeur vWorldUnitsPerTexel est calculée en prenant une limite du frustum de la vue et en divisant par la taille de la mémoire tampon.
FLOAT fWorldUnitsPerTexel = fCascadeBound /
(float)m_CopyOfCascadeConfig.m_iBufferSize;
vWorldUnitsPerTexel = XMVectorSet( fWorldUnitsPerTexel, fWorldUnitsPerTexel, 0.0f, 0.0f );
La limite de la taille maximale du frustum de vue entraîne un ajustement plus souple pour la projection orthographique.
Il est important de noter que la texture est supérieure de 1 pixel en largeur et hauteur lors de l’utilisation de cette technique. Cela empêche l’indexation des coordonnées d’ombre en dehors de la carte fantôme.
Face arrière et face avant
Les clichés d’ombres doivent être rendus avec l’élimination de la face arrière standard, un processus qui ignore la rastérisation des objets que la visionneuse ne peut pas voir et accélère le rendu de la scène. Une autre option courante consiste à afficher des cartes d’ombres avec l’élimination de la face avant activée, ce qui signifie que les objets faisant face à la visionneuse sont éliminés. L’argument pour cela est qu’il aide à l’ombre automatique, car la géométrie qui compose l’arrière des objets est légèrement décalée. Il y a deux problèmes avec cette idée.
- Tout objet avec une géométrie de face avant ou de face arrière incorrecte provoque des artefacts dans la carte d’ombres. Toutefois, une géométrie de face avant ou de face arrière incorrecte entraîne d’autres problèmes. Il peut donc être prudent de supposer que la géométrie face avant et face arrière est effectuée correctement. Il peut être peu pratique de créer des faces arrière pour la géométrie basée sur des sprites, comme le feuillage.
- Peter Panning et les espaces d’ombre près de la base d’objets tels que les murs sont plus susceptibles de se produire parce que la disparité de profondeur de l’ombre est trop faible.
Géométrie compatible avec les cartes d’ombres
La création d’une géométrie qui fonctionne bien dans les cartes d’ombres permet une plus grande flexibilité lors de la lutte contre les artefacts comme Peter Panning et l’acné d’ombre.
Les bords durs sont problématiques pour l’auto-ombre. La disparité de profondeur près de l’extrémité du bord est très faible. Même un petit décalage peut faire perdre leurs ombres aux objets (Figure 18).
Figure 18. Les arêtes pointues provoquent des artefacts provenant de la disparité de faible profondeur avec les décalages
Les objets étroits tels que les murs doivent avoir des dos même s’ils ne sont jamais visibles. Cela augmentera la disparité de profondeur.
Il est également important de s’assurer que la direction de la géométrie est correcte. autrement dit, l’extérieur d’un objet doit être orienté vers l’arrière et l’intérieur d’un objet doit être orienté vers l’avant. Cela est important pour le rendu avec l’élimination de la face arrière activée, ainsi que pour lutter contre les effets du biais de profondeur.
Récapitulatif
Les techniques décrites dans cet article peuvent être utilisées pour améliorer la qualité des shadow maps standard. L’étape suivante consiste à examiner les techniques qui peuvent bien fonctionner avec les shadow maps standard. Les machines virtuelles cloud sont recommandées en tant que technique supérieure pour combattre l’alias de perspective. Les mappages d’ombres de pourcentage plus proches ou de variance peuvent être utilisés pour adoucir les bords de l’ombre. Pour plus d’informations, consultez l’article technique Cascaded Shadow Maps .
Donnelly, W., and Lauritzen, A. Variance Shadow Maps. Symposium on Interactive 3D Graphics, Proceedings of the 2006 Symposium on Interactive 3D Graphics and Games. 2006, p. 161 à 165.
Engel, Woflgang F. Section 4. Cartes d’ombres en cascade. ShaderX5, Advanced Rendering Techniques, Wolfgang F. Engel, Ed. Charles River Media, Boston, Massachusetts. 2006. p. 197-206.
Stamminger, Marc et Drettakis, George. Cartes d’ombres de perspective. International Conference on Computer Graphics and Interactive Techniques, Actes de la 29e Conférence annuelle sur l’infographie et les techniques interactives. 2002, p. 557-562.
Wimmer, M., Scherzer, D., et Purgathofer, W. Light Space Perspective Shadow Maps. Symposium eurographique sur le rendu. 2004. Révisé le 10 juin 2005. Technische Universität Wien.