Salut à tous,


Pour mon petit moteur 3D j'ai implémenté un système de shadow volume. Tout fonctionnait bien jusqu'a ce que je me rends compte que lorsque j'ai une superposition d'objets donc des ombres, j'obtiens un bug : l'ombre du premier objet annule l'ombre du second et ainsi de de suite pour un ensemble d'objets superposés. Ce n'est pas évident à expliquer donc voici une petite image histoire de voir ca en couleur :


Voilà donc, sur l'image on peut voir plusieurs objets et la façon dont comment réagissent les ombres entre elles.
Vue la nature du problème je pense que le bug vient d'un bug d'incrémentation du stencil buffer. J'ai donc cherché de ce coté là, mais sans succès, et je dois dire qu'a force de chercher je me suis un peu embrouillé sur le fonctionnement du stencil entre le glStencilFunc et le glStencilOp. Une vision extérieurs et sein de toute embrouille pourra peut être trouver l'embrouille.
Je vous poste donc aussi la partie du code correspondant au stencil buffer (méthode en une passe plus courte, la méthode en 2 passes donne le même résultat )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
 
 
void RxShadowVolume::DrawOnePass()
{
 
			glClear(GL_STENCIL_BUFFER_BIT);
			glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); //désactive l'écriture du tampon chromatique
			glDepthFunc(GL_LESS);
			glDepthMask(GL_FALSE);  // désactive l'écriture du tampon de profondeur
 
			glEnable(GL_POLYGON_OFFSET_FILL);
			glPolygonOffset(polyoffset.x, polyoffset.y);
 
 
			glStencilFunc(GL_ALWAYS, 0xff, 0xff);
			glStencilOpSeparate(GL_FRONT,GL_KEEP,GL_INCR_WRAP,GL_KEEP);
			glStencilOpSeparate(GL_BACK,GL_KEEP,GL_DECR_WRAP,GL_KEEP);
			glEnable(GL_STENCIL_TEST);
 
				DrawVolumes(); //dessine les faces arrières des volumes d'ombre
 
			//on désactive les options qui ne sont plus utile
			glDisable(GL_POLYGON_OFFSET_FILL); 
			//glDisable(GL_CULL_FACE);
 
			//on réactive les tampons chromatique et de profondeur
			glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
			glDepthMask(GL_TRUE);
 
			//on dessine les ombres en fonction du stencil tampon
			glStencilFunc(GL_NOTEQUAL, 0, 0xff);
			glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
			DrawShadows();  //mask chromatique recouvrant l'ensemble de la scène
			glDisable(GL_STENCIL_TEST);
 
}
Voilà donc si quelqu'un trouve le pourquoi du comment de mon bug, je veux bien une petite explication.