[OpenGL] shadow volume

Le côté programmation du développement d'un jeu vidéo.

shadow volume

Messagepar wishtchoco » 25 Juil 2008, 09:31

Bonjour à toutes et à tous!

Je cherche à appliquer la technique du shadow volume sur ma scène à partir du tuto de NEHE
.
Et j'aimerais vos avis:

Lorsque je lance mon appli, je demande à ce qu'elle ouvre un objet 3DS.

Lorsqu'elle ouvre cette objet 3DS, je lui demande:
1)de me le mettre dans une liste
2)de me générer le shadow volume associé graçe à l'appel d'une fonction
Donc pour résumer ca donne:

Code: Tout sélectionner
read3DSfile();
generateObj3DS
{
   generate3DSobj();
   generateShadowVolume();
}


Mais en faisant cela, j'obtiens un volume d'ombre "solide". Au lieu d'avoir une ombre, j'ai un volume qui prend les propriétés de mon matériau (texture, couleur...).

Je vous met l'imprime écran.

Comment est ce que je me débarasse de ca??? :00000005:
Fichiers joints
Problème_shadow_volume.JPG
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar yoyonel » 28 Juil 2008, 14:33

Yo :-)

T'es sure d'avoir bien réglé les fonctions de comparaison et écriture du stencil buffer (glStencilFunc(...) et glStencilOp(...)) ?

T'es sure de bien desactiver l'ecriture dans le buffer couleurs quand tu generes les shadows volumes (glColorMask(...)) ?

A la rigueur si tu as une archive du projet ou on peut jeter un coup d'œil :p

YoYo
Avatar de l’utilisateur
yoyonel
Hello World, I'm new !
 
Messages: 105
Inscription: 12 Avr 2005, 21:25
Localisation: Lyon

Messagepar wishtchoco » 29 Juil 2008, 20:13

Salut!

Bon à croire que je ne parviendrai pas à faire des ombres même avec les shadow volume!

Je me replonge dans les codes et je vérifie tes pistes.
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 29 Juil 2008, 21:03

Salut Yoyo! :D

Bon alors voilà ou j'en suis dans cette technique:

Voici la fonction Shadow3DS inspiré du tuto NEHE lesson 27:

Code: Tout sélectionner
void Shadow3DS(lib3ds_obj *obj, float *lp)
{
        unsigned int   i, j, k, jj;
   unsigned int   p1, p2;
   vertex_type     v1, v2;
   //set visual parameter

   for (i=0; i<obj->polygons_qty; i++)
        {

            if(  obj->polygon[i].normal[0]*lp[0]
                +obj->polygon[i].normal[1]*lp[1]
                +obj->polygon[i].normal[2]*lp[2] <0)
                              obj->polygon[i].visible = 1;
            else
                              obj->polygon[i].visible = 0;


   }

        glPushAttrib( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT | GL_POLYGON_BIT| GL_STENCIL_BUFFER_BIT  );

        glDisable(GL_LIGHTING);
        glDepthMask(GL_FALSE);
        glDepthFunc(GL_LEQUAL);
        glClearStencil(0);
        [B]glEnable(GL_STENCIL_TEST);
[/B]
        [B]glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
   glStencilFunc(GL_ALWAYS, 0, 0xffffffff);[/B]

   // first pass, stencil operation decreases stencil value
   glFrontFace(GL_CCW);
   [B]glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);[/B]
   

   for (i=0; i<obj->polygons_qty; i++)
        {
      if (obj->polygon->visible == 1)
                   {

                        for (j=0;j<2;j++)
                        {
            k = obj->polygon[i].neigh[j];

                                if ((!k) || (obj->polygon[k-1].visible) == 0){
               // here we have an edge, we must draw a polygon

                                        p1 = obj->polygon[i].p[j];
               jj = (j+1) % 3;
               p2 = obj->polygon[i].p[jj];


                //calculate the length of the vector
                                        v1.x = (obj->vertex[p1].x - lp[0])*100;
               v1.y = (obj->vertex[p1].y - lp[1])*100;
               v1.z = (obj->vertex[p1].z - lp[2])*100;

               v2.x = (obj->vertex[p2].x - lp[0])*100;
               v2.y = (obj->vertex[p2].y - lp[1])*100;
               v2.z = (obj->vertex[p2].z - lp[2])*100;


                      //draw the polygon
               glBegin(GL_TRIANGLE_STRIP);
                  glVertex3f(obj->vertex[p1].x,
                           obj->vertex[p1].y,
                           obj->vertex[p1].z);
                  glVertex3f(obj->vertex[p1].x + v1.x,
                           obj->vertex[p1].y + v1.y,
                           obj->vertex[p1].z + v1.z);

                  glVertex3f(obj->vertex[p2].x,
                           obj->vertex[p2].y,
                           obj->vertex[p2].z);
                  glVertex3f(obj->vertex[p2].x + v2.x,
                           obj->vertex[p2].y + v2.y,
                           obj->vertex[p2].z + v2.z);

                                        glEnd();
            }
         }
            }
   }

   // second pass, stencil operation increases stencil value
   glFrontFace(GL_CW);
   [B]glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);[/B]
   for (i=0; i<obj->polygons_qty;i++)
        {
      if (obj->polygon->visible == 1)
         for (j=0;j<2;j++){
            k = obj->polygon[i].neigh[j];
            if ((!k) || (obj->polygon[k-1].visible) == 0){
               // here we have an edge, we must draw a polygon
               p1 = obj->polygon[i].p[j];
               jj = (j+1)%3;
               p2 = obj->polygon[i].p[jj];

               //calculate the length of the vector
                                        v1.x = (obj->vertex[p1].x - lp[0])*100;
               v1.y = (obj->vertex[p1].y - lp[1])*100;
               v1.z = (obj->vertex[p1].z - lp[2])*100;

               v2.x = (obj->vertex[p2].x - lp[0])*100;
               v2.y = (obj->vertex[p2].y - lp[1])*100;
               v2.z = (obj->vertex[p2].z - lp[2])*100;

               //draw the polygon
               glBegin(GL_TRIANGLE_STRIP);
                  glVertex3f(obj->vertex[p1].x,
                           obj->vertex[p1].y,
                           obj->vertex[p1].z);
                  glVertex3f(obj->vertex[p1].x + v1.x,
                           obj->vertex[p1].y + v1.y,
                           obj->vertex[p1].z + v1.z);

                  glVertex3f(obj->vertex[p2].x,
                           obj->vertex[p2].y,
                           obj->vertex[p2].z);
                  glVertex3f(obj->vertex[p2].x + v2.x,
                           obj->vertex[p2].y + v2.y,
                           obj->vertex[p2].z + v2.z);
               glEnd();
            }
         }
   }

   glFrontFace(GL_CCW);
   [B]glColorMask(1, 1, 1, 1);[/B]

    //draw a shadowing rectangle covering the entire screen
   glColor4f(0.0f, 0.0f, 0.0f, 0.7f);

        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff);
   glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
   glPushMatrix();
   glLoadIdentity();

   glBegin(GL_TRIANGLE_STRIP);
      glVertex3f(-0.1f, 0.1f,-0.10f);
      glVertex3f(-0.1f,-0.1f,-0.10f);
      glVertex3f( 0.1f, 0.1f,-0.10f);
      glVertex3f( 0.1f,-0.1f,-0.10f);

   glEnd();

   glPopMatrix();

   glDisable(GL_BLEND);

   glDepthFunc(GL_LEQUAL);
   glDepthMask(GL_TRUE);
   glEnable(GL_LIGHTING);
   glDisable(GL_STENCIL_TEST);
   glShadeModel(GL_SMOOTH);
}


Je fais une première passe en validant le stencil buffer.

Je désactive le colorMap en passant les paramètres false à chaque canal.

Les fonctions stencilOp et stencilFunc je les ai copiées-collées du tuto.

Puis je rentre dans la première boucle afin de créer le vecteur "source-arrêtes" que je prolonge ensuite depuis l'arrête.

Dans la seconde passe je décrémente le tampon.

je fais ma boucle.

Puis je revalide le colorMask en passant que des 1 en paramètre.

je redéfinie StencilFunc et StencilOp comme dans le tuto et voilà le travail!


Mais manque de chance....ca marche pô!

Depuis mon premier post j'ai du merdouiller quelque part car je n'ai même plus les résultas que j'ai fournis en image. J'ai plus de scène qui s'affiche quand je lance la fonction shadow3DS!!!
A vouloir arranger le binz j'ai tous casser dans ma fonction apparemment!

J'ai donc quelque chose que je ne comprend franchement pas dans cette fonction. Peut être le stencil buffer, mais pourtant j'ai lu des tutos ....:00000020:

Shadow mapping et shaddow volume: même combat! Ca marchera pas pour tout de suite!
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar yoyonel » 30 Juil 2008, 21:35

OKi Oki oki, on PANIQUE pas ! :p

Bon à priori, le shadow volume est plus simple a faire tourner que son pote le shadowmap (en version non optimisée, brute force powah), c'est pas pour rien d'ailleurs que nehe a un tuto shadow volume et pas shadow map (mini lancé de troll ????? :p).

En fait l'avantage du shadow volume (en version naïve) est qu'il est partiellement calculé sur le CPU (calcul de silhouette, extrusion des shadow quads), donc on peut nettement plus facilement (comparativement au shadow map) débugguer via les ptites fonctions de dessin d'opengl :-D

Donc dans l'ordre :
  1. S'assurer du bon déroulement du calcul des silhouettes : donc faudrait te faire une fonction qui s'occupe de ça précisément et stocker les résultats du calcul des silhouettes, et ensuite afficher ces fameuses silhouettes pour être sur que tout va bien
  2. S'assurer de la bonne construction des shadow quad : donc pareil que 1, ptite fonction tout ça, et ensuite tu affiches en deux couleurs les shadow quads selon leur orientation (vert pour les backface, et rouge pour les frontface), tu vérifies que tout se passe bien (pas de dégénérescence dans les triangle_strip, et bonne combinaison de couleurs)
  3. Si t'as passé 1. et 2., tu dois maintenant gérer l'utilisation du stencil buffer. Bon là comme tu l'as deviné on passe du coté obscure du GPU donc nettement plus galère pour débugger. Relis les tutos sur l'utilisation de ce buffer et ... bonne chance ^^.
Bon sinon en dehors de tout ça, vérifie que ton hardware supporte bien le stencil buffer (récupère via glGetIntergerv(...) je crois, le nombre de bits associé au buffer stencil, si ça donne 0, ya un problème).

Dernier truc que j'ai remarqué, quand tu affiches le dernier quad pour recouvrir l'écran, faudrait peut être passer justement en mode 2D (config de la matrice de projection) pour être sure de bien recouvrir tout le screenspace :-)

Bon c'est tout pour l'instant je crois ... tiens moi au courant si tu avances !

!YoYoInTheShadow!

ps : pense a faire des screenshots de tout ça, ça peut être intéressant pédagogiquement :-)
Avatar de l’utilisateur
yoyonel
Hello World, I'm new !
 
Messages: 105
Inscription: 12 Avr 2005, 21:25
Localisation: Lyon

Messagepar wishtchoco » 01 Aoû 2008, 10:14

Salut, j'essaie de faire ce que tu me conseil, mais je bloque un peu.

Il faut que je fasse une fonction qui s'occupe des silhouettes, stocke les résultats du calcul des silhouettes, et ensuite affiche ces fameuses silhouettes pour être sur que tout va bien.
Par silhouette, tu entends la projection des rayons de lumière à objet afin de former le volume d'ombre?

Si c'est bien cela, je crée la fonction ci dessous:

Code: Tout sélectionner
void Silhouette3DS(lib3ds_obj *obj, float *lp)
{
    unsigned int   i, j, k, jj;
   unsigned int   p1, p2;
   vertex_type     v1, v2;
   //set visual parameter

   for (i=0; i<obj->polygons_qty; i++)
        {

            if(  obj->polygon[i].normal[0]*lp[0]
                +obj->polygon[i].normal[1]*lp[1]
                +obj->polygon[i].normal[2]*lp[2] <0)
                              obj->polygon[i].visible = 1;
            else
                              obj->polygon[i].visible = 0;


   }
   
        for (i=0; i<obj->polygons_qty; i++)
        {
      if (obj->polygon->visible == 1)
                   {

                        for (j=0;j<2;j++)
                        {
            k = obj->polygon[i].neigh[j];

                                if ((!k) || (obj->polygon[k-1].visible) == 0)
                                {
               // here we have an edge, we must draw a polygon

                                        p1 = obj->polygon[i].p[j];
               jj = (j+1) % 3;
               p2 = obj->polygon[i].p[jj];


                //calculate the length of the vector
                                        v1.x = (obj->vertex[p1].x - lp[0])*100;
               v1.y = (obj->vertex[p1].y - lp[1])*100;
               v1.z = (obj->vertex[p1].z - lp[2])*100;

               v2.x = (obj->vertex[p2].x - lp[0])*100;
               v2.y = (obj->vertex[p2].y - lp[1])*100;
               v2.z = (obj->vertex[p2].z - lp[2])*100;


                      //draw the polygon

               glBegin(GL_TRIANGLE_STRIP);

                  glVertex3f(obj->vertex[p1].x,
                           obj->vertex[p1].y,
                           obj->vertex[p1].z);
                  glVertex3f(obj->vertex[p1].x + v1.x,
                           obj->vertex[p1].y + v1.y,
                           obj->vertex[p1].z + v1.z);

                  glVertex3f(obj->vertex[p2].x,
                           obj->vertex[p2].y,
                           obj->vertex[p2].z);
                  glVertex3f(obj->vertex[p2].x + v2.x,
                           obj->vertex[p2].y + v2.y,
                           obj->vertex[p2].z + v2.z);

                                        glEnd();
            }
         }
            }
   }


}


Comme dans l'archive que je t'avais filée, les objets 3DS sont stockés dans des listes. Alors, pour appeler cette fonction je me place dans la fonction Render3DS qui va me lire le fichier 3DS en lui passant en paramètre l'objet désiré.

Pour un objet 3DS illustré par la figure 1, j'obtiens la figure 2 pour son calcul de silhouette.

Premier point: Le volume d'ombre dessiné par la projection des vecteurs lumière-objet vont me permettre de créer le volume graçe aux GL_TRIANGLE_STRIP. Mais ce volume reprend la couleur de l'objet:00000010:
ainsi que ses propriétés de réfraction. En effet, en fonction de mon point de vu, j'ai une couleur qui passe de rouge vif à noir.

On continue!!! Ca va finir par marcher!
Fichiers joints
Sans titre2.JPG
Sans titre1.JPG
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar yoyonel » 01 Aoû 2008, 15:16

Salut man !

Oki je reprend plus précisément ce que je voulais dire.

1) Les silhouettes : ce sont des edges (arêtes) qui forment la frontière entre les faces illuminées et non illuminées d'un mesh 3d (c'est pas une définition formelle, c'est juste ma façon de voir les choses).
Donc une silhouette est un segment (2 points) qui sépare deux faces (triangles), une des faces associée à l'arête est illuminée (produit scalaire de la normale associée à la face et du vecteur directeur de lumière est positif) et l'autre face est non-illuminée (produit scalaire négatif).
Donc ce que je veux dire dans 1), c'est de calculer une fois pour toute les silhouettes (arêtes) de ton objet ou ensemble d'objets (3ds ou non) et de les stocker pour pouvoir les afficher (afficher des arêtes, segments) par dessus le mesh et vérifier que ça correspond bien à la définition décrite ci-dessus :-)

2) Shadow-Quad : A partir d'une silhouette (i.e : arête de contour), tu peux former par projection un quad (semi-infini) en prenant les points formant ton arête de contour et les projetant avec le vecteur directeur reliant le centre de la source de lumière (point de lumière) et les sommets. L'idée pour débuger efficacement serait d'afficher en transparence ces shadow-quads, avec une couleur (et non un dégradé) codifiant l'orientation du quad (CW ou CCW). Pour t'aider à mieux visualiser tu peux aussi afficher en ligne pleine les contours des quads (un des contours sera l'arête de contour génératrice).


Bon j'ai été un peu verbeux cette fois ci, histoire d'être sure qu'on se comprenne bien :-)
Essaie de faire ce que je dis progressivement, ça devrait fonctionner, et tu devrais avoir une bien meilleur compréhension de la méthode (enfin je pense :p).
Règle au plus vite tes problèmes de matériaux tout ça (désactive la prise en charge des matériaux, et la gestion de lumière pour tout ce qui est affichage de debug).

Tiens moi au courant,

YoYo
Avatar de l’utilisateur
yoyonel
Hello World, I'm new !
 
Messages: 105
Inscription: 12 Avr 2005, 21:25
Localisation: Lyon

Messagepar wishtchoco » 04 Aoû 2008, 16:28

Salut,

Petit post pour décrire l'avancement:


J'ai fait une fonction qui me dessine la partie de mon objet qui est illuminée par la lumière. Pour se faire je calcule le produit scalaire de la normal de ma surface avec la position de la lumière.
Mais j'obtiens les POLYGONES éclairés, pas la silhouette!
alors je taf dessus pour bien obtenir les contours éclairées de mon objet
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 04 Aoû 2008, 16:30

j'ai oublié les images....:00000009:
Fichiers joints
shadow_volume2.JPG
shadow_volume_1.JPG
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 05 Aoû 2008, 12:00

A y est! J'ai mes silhouettes qui définissent les frontières entre facette éclairée et facette non éclairée! :00000020:

Maintenant passons au shadow Quad

Pour ce qui est des fonctions, je peux les poster si besoin.
Fichiers joints
silhouette.JPG
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar yoyonel » 05 Aoû 2008, 13:22

Cool cool :-)

pour le source code des fonctions, je pense que c'est pas nécessaire pour l'instant.

Pour les shadows-quad, pense bien à afficher en transparence les quads et ligne pleine les contours. Pense a affecter un jeu de deux couleurs pour les orientations des quads (CW-Red, CCW-Green, par exemple).

YoYo
Avatar de l’utilisateur
yoyonel
Hello World, I'm new !
 
Messages: 105
Inscription: 12 Avr 2005, 21:25
Localisation: Lyon

Messagepar wishtchoco » 05 Aoû 2008, 15:09

je comprend pas comment je peux utiliser 2 couleur en fonction de l'orientation de mes quads...

J'ai pour le moment une fonction de la forme:

Code: Tout sélectionner
void TracerOmbre(vertex_type A, vertex_type B)
{
        glEnable (GL_COLOR_MATERIAL);
       
        GLfloat Noir[] = {0.0f, 0.0f, 0.0f, 0.25f};
        glColor4fv(Noir);

        vertex_type v1, v2,N1;  //v3, v4,  N2;
        glEnable(GL_BLEND) ;
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;


                v1.x = (A.x - light_position[0])*100;
            v1.y = (A.y - light_position[1])*100;
           v1.z = (A.z - light_position[2])*100;

            v2.x = (B.x - light_position[0])*100;
             v2.y = (B.y - light_position[1])*100;
              v2.z = (B.z - light_position[2])*100;

                // Compute normal
                N1.x = (B.y - A.y) * (v1.z - A.z) - (v1.y - A.y) * (B.z - A.z);
                N1.y = -(B.x - A.x) * (v1.z - A.z) + (v1.x - A.x) * (B.z - A.z);
                N1.z = (B.x - A.x) * (v1.y - A.y) - (v1.x - A.x) * (B.y - A.y);

                //draw the polygon
           glBegin(GL_TRIANGLE_STRIP);
           glNormal3f(N1.x, N1.y, N1.z);
           glVertex3f(A.x, A.y, A.z);
           glVertex3f(A.x + v1.x, A.y + v1.y, A.z + v1.z);
            glVertex3f(B.x, B.y, B.z);
             glVertex3f(B.x + v2.x, B.y + v2.y, B.z + v2.z);
                glEnd();
       
        glDisable (GL_COLOR_MATERIAL);



}



Cette fonction recoit en parametre:
A et B : les 2 points d'un segment definissant une frontière entre face éclairée et non-éclairée.

Je gère la transparence.

Mais comment est ce que je gère les couleur en fonction de l'orientation de mes quads?

Pour le moment j'obtiens les résultats ci-dessous

J'ai du mal à bien comprendre comment ca marche
Fichiers joints
perspective_ombre.jpg
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 05 Aoû 2008, 15:40

en modifiant la postion de mes glCullFace(GL_BACK), plus précisément en les activant et désactivant à chaque fois que je crée un objet, je trouve une projection plus propre: il n'y a plus les hachures que j'avais tout à l'heure.

A l'inverse, je perd en qualité de réprésentation de mon objet 3DS. Comme si les polygones qui composent mon objets le rayé.

Ensuite, ce que je nomme "la projection" (cette forme noir transparente) est ce que tu appelles shadow-quad?

Ah, oui, autre petit détail troublant:
J'ai tracé mes edges en vert. Lorsque je trace mon cone d'ombre j'ai des reflet vert qui apparaissent sur les cotés...
Fichiers joints
perspective_ombre2.jpg
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 05 Aoû 2008, 16:38

En désactivant la lumière lorsque je fait mes projections, je n'ai plus le problème des couleurs verte.

Pour avoir 2 couleurs en fontion de l'orientation j'ai dessiné une première fois les projection en mentionnant glFrontFace(GL_CCW) et la couleur (du noir par exemple).
Puis je fais glFrontFace(GL_CW) avec une autre couleur (du rouge par exemple).

ca me donne un rouge plus pale. Mais est ce bien ce que tu me conseillais de faire?
Fichiers joints
perspective_ombre3.jpg
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 06 Aoû 2008, 09:14

Bonjour bonjour!

Bon, comme d'hab en fouinant un peu dans les forums on trouve parfois ce que l'on cherche.

En l'occurence, je viens de voir que dans mon code précédemment posté, si j'avais un bug dans la définition d'un polygone, et plus particulièrement dans le sens des glVertex, et bien, techniquement, je devrais avoir une couleur différente de celle des autres.
Or dans l'image postée, je n'ai pas ce problème....donc je peux imaginer que je n'ai pas de problème à ce niveau et que je peux passer aux stencil buffer
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 06 Aoû 2008, 09:29

Donc nouveau post....

Comment passer aux problèmes du stencil buffer (partons optimiste....il y aura pleins de problèmes :00000023: ).

Est ce que je fais une autre fonction dans laquelle j'applique l'algo de NEHE-lesson 27 dans laquelle j'appelle la fonction qui me trace les shadow-quads?
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 06 Aoû 2008, 15:30

Voilà où j'en suis, je met en pièce jointe les illustrations de mes fonctions.

On notera que pour passer de la 2eme à la 3eme étape, lorsque je veux appliquer l'algo de shadow volume, je désactive la couleur et la transparence qui m'on permis de créer la 3eme figure.

Donc quand je veux créer toute la chaine, la seule transparence et couleur activées sont celle de l'algo nehe.

Le problème est que je n'obtiens rien !!! :00000017:

Alors si un ame charitable trainé dans le coin.....
Fichiers joints
Sans titre.JPG
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Help !!

Messagepar wishtchoco » 07 Aoû 2008, 09:20

J'ai pris beaucoup de retard, et mon algo est toujours bloqué à la phase du stencil buffer.

Lorsque je fais la première phase uniquement, j'ai un gros volume qui part de mon objet et qui descend à travers mon sol. Mon sol ne cache même pas ce qui passe en dessous!

Et lorsque je fais ma deuxième phase........rien ne s'affiche! pas même une petite ombre! RIEN!

raaaaaaah!
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar yoyonel » 07 Aoû 2008, 10:42

Yo man !

C'est sympa les screens que tu postes, ca commence a ressembler à quelque chose (meme si ca ne fonctionne pas toujours :p).

Ce que tu me décris en mode debug (affichage des shadow-quads), ca va pas !
Pense a activer le depth buffer, la fonction de depth_test, etc, etc ...

Pour le stencil, vérifie que tu as un buffer alloué pour le stencil (récupère (glGetIntegerv(...) le nombre de bits associé au buffer stencil).
Après essai d'utiliser le stencil pour des exemples simples, que tu controles, et vérifie que ca fonctionne comme tu le souhaites.
Normalement en suivant le tuto de nehe, tu devrais pouvoir t'en sortir ...

Ptite astuce en debug, tu peux encadrer tes méthodes de dessin, et configuration de la machine opengl, par des glPushAttrib(GL_ALL_ATTRIB_BITS)/glPopAttrib qui sauvegardent/restaurent le contexte opengl (tout le contexte ! à n'utiliser qu'en debug !).

Voili, voilou, bonne chance, et ne soit pas impatient, essaie de savoir ce que tu fais à chaque étape (je sais, ce n'est pas forcément facile, mais c'est la bonne solution je pense).

YoYo
Avatar de l’utilisateur
yoyonel
Hello World, I'm new !
 
Messages: 105
Inscription: 12 Avr 2005, 21:25
Localisation: Lyon

Messagepar wishtchoco » 07 Aoû 2008, 11:17

en fait la je suis largué!

Qu'est ce qui ne te va pas? La fonction qui me trace les projections des edges?

j'ai activé à l'init mon GL_DEPTH_TEST. Je ne le désactive que lorsque je commence les opérations avec le stencil buffer et je le réactive à la fin.

Le truc qui me choc, c'est que le volume des shadow quads qui passe deriere mon sol est tout le temps visible. ce qui donne cette impression que le sol ne coupe pas le volume....

pour la taille du buffer j'obtiens 8 bits avec

GLint res;
glGetIntegerv(GL_STENCIL_BITS, &res);
printf("res: %d \n", res);
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 07 Aoû 2008, 12:02

ok, trouvé pour le DEPTH_TEST.....

maintenant j'ai bien un plan qui coupe les shadow quads.
je continue:00000021:
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar yoyonel » 07 Aoû 2008, 14:17

Oki c'est cool, tu avances :-)

J'allais te le dire pour le Depth_Test,
il n'y a pas de raison de le désactiver (au contraire même,
la méthode de base de shadow volume a aussi pour nom : Shadow-Volume Z-Pass, la version un peu plus avancée elle se nomme : Shadow-Volume Z-Fail, dans les deux cas on parle du test de profondeur (donc besoin de l'activer pour qu'il soit pris en compte).

A priori, au vu des screens, ton calcul d'edges (aretes de contour) et projection des shadow-quads me semblent correctes, donc si tu suis maintenant ce que fait nehe dans son tuto, tu devrais commencer à avoir des résultats, pas forcément exacte mais tu devrais voir des trucs qui se rapprochent du résultat escompté !

Bonne chance,
tiens nous au courant,
YoYo
Avatar de l’utilisateur
yoyonel
Hello World, I'm new !
 
Messages: 105
Inscription: 12 Avr 2005, 21:25
Localisation: Lyon

Messagepar wishtchoco » 07 Aoû 2008, 15:38

alors je trouve ce que j'ai mis en image.
Mon problème persiste sur le passage des étapes du shadow volume.

Première étape un volume noir plein apparait alors que le blending est activé.
Deuxième étape, rien n'est apparent sur le sol...

Du fait que j'ai tous mis dans une list, je ne peux pas vérifier si le Stencil buffer est activé avec glIsEnable (cf. red book). De toute manière c'est bien écrit dans le code glEnable(GL_STENCIL_BUFFER)...

Mais est ce que ces symptomes te disent quelques choses?
Fichiers joints
Sans titre.JPG
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 08 Aoû 2008, 12:09

je crois que mon problème vient du plan que tu traces en toute fin de la fonction.

J'ai du mal à comprendre comment ca marche....

Je doit construire un plan qui est face à moi (sa normal vient ou part vers moi) ou bien un plan parallèle au sol?

Dans le tuto de NEHE, ce plan est très petit.....ne devrait il pas couvrir tout l'écran?:00000010:
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 11 Aoû 2008, 16:52

Bon voilà ou j'en suis:

  • réaliser les contours
  • prolonger les contours en segments semi-infinis


Lorsque je fais mes passes. J'ai un problème sur la facon dont il faut créer le masque qui me servira pour le test final du stencil buffer.

Pour le moment, j'ai un masque qui occupe que la moitié de mon écran (l'écran est coupé verticalement). Pour le coup, je ne vois qu'une moitié de shadow volume dans la première passe. Si je modifie mon point de vu, je peux obtenir un shadow quad au complet.

Mais lorsque je lance la dernière passe.....plus rien!!!


:mad:
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Suivante

Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 9 invités

cron