FurMark
Current Version: 1.8.2
»FurMark homepage
»FurMark 1.8.x Submissions
»Benchmark Submissions

GPU Caps Viewer
Current Version: 1.9.0
»GPU Caps Viewer homepage
»GPU DB Submissions

PhysX FluidMark
Current Version: 1.2.0
»FluidMark homepage
»FluidMark 1.2.x Submissions
»Benchmark Submissions

GeeXLab
Current Version: 0.2.0
»GeeXLab homepage
»GeeXLab Overview

GPU Shark
Current Version: 0.2.3
»GPU Shark homepage

TessMark
Current Version: 0.2.0
»TessMark homepage

Blogs
»JeGX's Infamous Lab

 
Ombres Volumiques
Stencil Shadow Volumes

Par Jérôme 'JeGX' GUINOT - The oZone3D Team
jegx [at] ozone3d [dot] net

Version initiale: 21 Septembre 2005


1 - Introduction

2 - Fonctionnement

3 - Les Stencil Shadow Volumes dans Demoniak3D

4 - Les contraintes à respecter

5 - Downloads




1 - Introduction


Les ombres et l'ombrage représentent un domaine particulièrement actif dans la 3D. L'ombrage est au coeur du réalisme d'une scène 3D. Les ombres résultent d'une interaction entre la lumière et les objets. Les ombres nous permettent de capter la profondeur de la scène et surtout confèrent un poids aux objets 3D (nous n'avons pas cette impression de flottement). Les ombres se classent en deux grandes catégories:
  • les ombres douces
  • les ombres dures
Dans la réalité de tous les jours, les ombres dures n'existent pas, seules les ombres douces ont une existance réelle. Mais dans certains cas et vu de loin, les ombres douces ressemblent à des ombres dures. Tout ça c'est bien beau, mais cela mérite un peu plus d'explications. Une ombre est dite douce lorsque le passage de la zone ombrée à la zone éclairée se fait progressivement. Cette zone de transition se nomme la pénombre.


fig. 1 - Ombre douce


Sur la figure 1, l'ombre douce se voit très clairement. Au contraire, une ombre est dite dure si le passage de la zone ombrée à celle éclairée se fait sans transition comme le montre la figure 2.


fig. 2 - Ombre dure


Les ombres douces sont très réalistes mais sont relativement complexes à reproduire en 3D temps réel. Les algorithmes de "soft-shadows" commencent à arriver mais nécessitent des cartes 3D musclées (genre GeForce 6800 GT ou mieux GeForce 7800 GTX). Les hard-shadows, quand à elles, sont de loin plus rapides à générer et sont devenues monnaie courante dans les jeux vidéo récents. Mais il est un jeu qui a vraiment mis les ombres dures en avant: Doom 3.


fig. 3 - Doom3 - Copyright 2004 Id Software


La technique utilisée dans Doom 3 pour créer ces ombres dures porte un nom bien précis: les Stencil Shadow Volumes ou ombres volumiques basées sur le stencil.

Le stencil, plus connu sous le nom de stencil buffer, est une zone mémoire particulière sur la carte graphique qui est utilisée dans toute sorte d'effets spéciaux dont les ombres volumiques. Il n'est pas question ici de détailler son fonctionnement puisqu'il faudrait entrer au coeur d'OpenGL ou de Direct3D pour vraiment comprendre. L'important est de savoir que sans la présence de cette zone mémoire particulière, les ombres volumiques ne pourraient tout simplement pas voir le jour...

Nous allons maintenant voir comment tout cela fonctionne puisque Demoniak3D exploite les Stencil Shadow Volumes...




2 - Fonctionnement


Dans le fonctionnement global des stencil shadow volumes, trois acteurs interviennent:
  • la lumière
  • le shadow-caster
  • le shadow-receiver
La lumière est en général une source de lumière de type positionnelle ou OMNI.

Le shadow-caster est le lanceur d'ombre: c'est l'objet qui va bloquer la lumière et créer l'ombre proprement dite. Le shadow-receiver est un objet qui "reçoit" l'ombre, ou plus précisément c'est l'objet (tout ou une partie seulement) qui est privé de lumière.

Les ombres sont dites volumiques tout simplement parce que le shadow-caster va créer un volume d'ombre dans lequel les objets s'y trouvant ne recevront pas de lumière. La figure 4 montre le volume d'ombre généré par un tore:


fig. 4 - Shadow Volume


Le principe des shadow volumes est de détecter la silhouette d'un objet depuis le point de vue d'une source de lumière et de projeter cette silhouette dans la direction formée par le vecteur entre la lumière et l'objet. La projection de la silhouette formera le volume d'ombre.




3 - Les Stencil Shadow Volumes dans Demoniak3D


Maintenant que nous avons vu les principes de base des shadow volumes, passons à la pratique. Au niveau de Demoniak3D, les ombres volumiques ne fonctionnent qu'avec des meshes ou des modèles puisque ce sont en fait les seuls objets 3D qui ont une réalité (virtuelle quand même...) dans la scène 3D.

Ceci dit, l'utilisation des shadow volumes est aisée, puisqu'il suffit de mettre à TRUE l'attribut shadow_caster des noeuds mesh ou model. Vraiment simple!


fig. 5 - Le projet d'exemple


Le script suivant (script 1) permet d'obtenir la scène de la figure 5. Cette scène contient un sol, qui se comporte en shadow-receiver, et deux objets 3D (2 modèles), qui sont des shadow-casters. La petite sphère blanche en fil de fer représente la position de la source lumineuse.
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<hyperion version="1.0">
<!--
====== SCENE =======================================
-->
<scene name="StencilShadowVolume_Demo_1"  
       display_fps="TRUE" 
	   vsync="TRUE" 
	   show_ref_grid="FALSE" >
	   
	<window_size width="1024" height="768" />
	<global_ambient_light r="0.2" g="0.2" b="0.2" />
	<background_color r="0.1" g="0.1" b="0.1" />
</scene>

<!--
====== LIGHT ==========================================
-->
<light name="Light_01" render="TRUE" >
	<position x="0.0" y="150.0" z="100.0" />
	<ambient r="0.2" g="0.2" b="0.2" a="1.0" />
	<diffuse r="1.0" g="1.0" b="1.0" a="1.0" />
	<specular r="1.0" g="1.0" b="1.0" a="1.0" />
</light>

<!--
====== CAMERA =========================================
-->
<camera name="Main_Camera"  >
	<position x="30.0" y="100.0" z="200.0" />
</camera>

<!--
====== FLOOR =========================================
-->
<texture name="floor_tex" 
         filename="data/Speckles_LightBlue_df.dds" />

<material name="floor_mat" >
	<ambient r="0.7" g="0.7" b="0.7" a="1.0" />
	<diffuse r="0.9" g="0.9" b="0.9" a="1.0" />
	<specular r="0.1" g="0.1" b="0.1" a="1.0" exp="10.0" />
</material>

<mesh name="floor" shape_type="PLANE" 
      lighting="TRUE" texturing="TRUE" 
	  polygon_mode="SOLID" use_vbo="TRUE" >
	<plane x_size="500.0" z_size="500.0" 
	       num_segs_x="20" num_segs_z="20" />
	<attach_material name="floor_mat" />
	
	<texture material_name="floor_mat" 
             texture_name="floor_tex" 
             texture_unit="0"
             u_tile="1.0" v_tile="1.0" />
</mesh>

<!--
====== TORUS MESH =======================================
-->
<material name="mat_torus" specular_exp="60.0">
	<ambient r="0.3" g="0.3" b="0.3" a="1.0" />
	<diffuse r="0.9" g="0.5" b="0.5" a="1.0" />
	<specular r="0.6" g="0.6" b="0.6" a="1.0" />
</material>

<mesh render="TRUE" name="torus" shape_type="TORUS" 
      lighting="TRUE" use_vbo="TRUE"
      improve_specular_highlights="TRUE" 
	  shadow_caster="TRUE" remove_seam="TRUE" >
	
	<torus vertex_density="50"/>
	<position x="-70.0" y="50.0" z="0.0" />
	<attach_material name="mat_torus" /> 
</mesh>


<!--
====== SPHERE MESH =======================================
-->
<material name="mat_sphere" specular_exp="60.0">
	<ambient r="0.3" g="0.3" b="0.3" a="1.0" />
	<diffuse r="0.5" g="0.5" b="0.9" a="1.0" />
	<specular r="0.6" g="0.6" b="0.6" a="1.0" />
</material>

<mesh render="TRUE" name="sphere" shape_type="SPHERE" 
      lighting="TRUE" use_vbo="TRUE"
	  improve_specular_highlights="TRUE" shadow_caster="TRUE" 
	  remove_seam="TRUE"  >
	
	<sphere radius="40.0" stacks="40" slices="40"/>
	<position x="70.0" y="40.0" z="0.0" />
	<attach_material name="mat_sphere" /> 
</mesh>

</hyperion>

Script 1 – StencilShadowVolume_Demo_1.xml

Le script 1 ne présente pas de difficultés particulières, mais il introduit quelques petites nouveautés et subtilités.

L'attribut global_ambient_light du noeud scene permet de spécifier la couleur de la lumière ambiante globale de la scène en l'absence de toute source lumineuse (les noeuds light). Cette spécification est importante puisque dans le volume d'ombre, les objets (les shadow-receivers) ne sont éclairés que par cette lumière ambiante globale. Par défaut, dans Demoniak3D, elle est initialisée à R=0.1, G=0.1 et B=0.1. Donc une valeur très faible.

Il faut aussi porter une attention toute particulière au choix de la composante ambiante de la lumière et des matériaux. Ceci est primordial pour obtenir une belle ombre propre. Pour rappel, l'ombre propre d'un objet est la partie de l'objet qui ne reçoit pas d'éclairage direct (ou diffus) de la lumière, et qui est seulement éclairée par l'éclairage ambiant de cette même lumière. Dans le cas de la sphère bleue de la figure 5, l'ombre propre est la partie sombre (mais que l'on distingue), tandis que la partie bleutée (avec le reflet blanchâtre) est celle qui est directement exposée à la source de lumière et qui reçoit l'éclairage diffus (et spéculaire).

Mais le choix des composantes ambiantes de la lumière et des matériaux est important aussi pour une autre raison: masquer et cacher le rendu de l'ombre due à la silhouette. La figure 6 montre le rendu de la scène avec un mauvais choix des composantes ambiantes, et aussi une sphère comportant peu de polygones.


Fig.6 – Mauvais réglage des composantes ambiantes


Dans la scène de la figure 6, les paramètres de la sphère au niveau du noeud mesh sont les suivants:
<mesh name="sphere" shape_type="SPHERE" >
	<sphere radius="40.0" stacks="20" slices="20"/>
	</mesh>


Cette faible densité de polygones provoque cet hideux effet d'escalier sur le côté ombré de la sphère. C'est un des petits inconvénients des stencil shadow volumes: l'algorithme nécessite des objets assez denses en polygones pour avoir une belle silhouette.

Les composantes ambiantes du matériau de la sphère et de la lumière sont, quant à elles, réglées de la manière suivante:
<material name="mat_sphere" >
	<ambient r="0.5" g="0.5" b="0.5" a="1.0" />
</material>

<light name="Light_01" >
	<ambient r="0.5" g="0.5" b="0.5" a="1.0" />
</light>


Ces réglages accentuent le rendu de l'ombre volumique sur la sphère elle-même. Une première façon d'améliorer l'aspect visuel de la scène de la figure 6 est de régler correctement les composantes ambiantes de la lumière et du matériau de la sphère. Le réglage suivant, tout en gardant la faible densité de maillage de la sphère, donne le résultat de la figure 7:


Fig.7 – Bon réglage des composantes ambiantes


Cela commence à être excellent! Mais, en regardant de plus près, on aperçoit encore l'effet d'escalier dû à la faible densité du maillage de la sphère (figure 8).


Fig.8 – On distingue encore l'effet d'escalier...


La solution pour faire disparaître complétement cet effet d'escalier est d'augmenter la densité du maillage:
<mesh name="sphere" shape_type="SPHERE" >
	<sphere radius="40.0" stacks="50" slices="50"/>
	</mesh>


Avec ces réglages, l'effet d'escalier est devenu imperceptible, comme le montre la figure 9.


Fig.9 – Disparition de l''effet d'escalier


Cet exemple montre que pour obtenir un rendu à base de stencil shadow volume, il faut que les objets 3D aient une certaines densité de maillage, et que les composantes ambiantes des matériaux et des lumières soient réglées à des valeurs relativement faibles.

C'est d'ailleurs cette valeur faible des composantes ambiantes qui fait que les scènes exploitant les ombres volumiques sont assez sombres. Le jeu Doom 3 en est un parfait exemple!




4 - Les contraintes à respecter


Comme toujours en 3D temps réel, les effets graphiques les plus spectaculaires ont un prix! La règle la plus contraignante est au niveau de la modélisation des objets 3D. Tous les modèles 3D ne sont pas candidats pour être shadow-caster. Pour pouvoir projeter une ombre volumique, les meshes constituant un modèle doivent être fermés.

Mais qu'est-ce donc un mesh fermé?

Avant de donner la définition, faisons juste un petit rappel sur la structure de la surface d'un mesh. Un mesh est une surface composée d'un maillage triangulaire. Chaque triangle représente une face et est composé de 3 vertices et 3 côtés (edges en anglais). Le mesh le plus simple que l'on puisse faire est... un triangle.


Fig.10 – Le triangle: composant de base d'un mesh


Un mesh est dit fermé si chaque côté (edge) est partagé par 2 faces (chaque côté possède 2 faces adjacentes).

La sphère est l'exemple parfait d'une surface fermée. Vous ne pouvez pas y trouver de côté qui n'appartient qu'à une seule face. Un plan, au contraire, est l'exemple même d'une surface non fermée (ou surface ouverte!): chaque côté des bords appartient à une face et une seule.

Un côté qui ne possède qu'une seule face est appelé un crack. Donc un mesh contenant des cracks ne pourra pas projeter correctement des ombres volumiques. Cette limitation provient de l'algorithme de détection de silhouette qui pour fonctionner nécessite des surfaces fermées.

Le modèle de la théière, que l'on peut générer rapidement avec 3D Studio MAX par exemple, possède des cracks. Le couvercle de la théière est une surface non fermée. Le résultat de la présence de ces cracks est visible sur la figure 11.


Fig.11 – Les surfaces non fermées provoquent des défauts visuels


Donc la modélisation en vue de projeter des ombres volumiques doit se faire en gardant à l'esprit la contrainte de surface fermée. Par exemple, si vous souhaitez qu'une surface plane (comme un mur) soit un shadow-caster, il suffit de la modéliser comme une boîte qui aurait une épaisseur très faible. Vu de loin, ça ressemble à un plan mais, pour l'algorithme d'ombres volumiques qui voit le modèle de très près, la boîte est une surface fermée.

Une autre contrainte à prendre en compte est le nombre de sources de lumière. L'algorithme des stencil shadow volumes est par nature un algorithme multi-passes. C'est-à -dire que la scène complète est rendue pour chaque source lumineuse. Si la scène est chargée en polygones, le nombre de FPS (Frames Per Second) risque de chuter drastiquement! Exemple: si vous avez une scène composée de 100000 polygones et 3 sources de lumières, il y aura près de 300000 polygones qui seront rendus à chaque frame.


Fig.12 – Modèle eclairé par 2 sources de lumières – Code Sample 70


5 - Downloads


Téléchargez la demo d'accompagnement




Langue:

3D Graphics Search Engine:

The Geeks Of 3D





Geeks3D's Articles
»GPU Memory Speed Demystified

»Multi-Threading Programming Resources

»GeForce and Radeon OpenCL Overview

»How to Get your Multi-core CPU Busy at 100%

»How To Make a VGA Dummy Plug

»Night Vision Post Processing Filter



Geeks3D latest news

Demoniak3D
Current Version: 1.23.0
»Demoniak3D
»Download
»Libraries and Plugins
»Demos
»Online Help - Reference Guide
»Codes Samples


Misc
»Texture DataPack #1
»Asus Silent Knight CPU Cooler
Page generated in 0.045520067214966 seconds.