IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

stencil buffer : comprend pas son fonctionnement


Sujet :

OpenGL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut stencil buffer : comprend pas son fonctionnement
    Bonjour,

    Imaginons se code:

    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
    glDepthMask(GL_FALSE);
    glColorMask(0, 0, 0, 0);
     
    glEnable(GL_STENCIL_TEST);
    glClear(GL_STENCIL_BUFFER_BIT); //met le stencil buffer à 0
     
    glStencilFunc(GL_ALWAYS, 128, ~0); //valeur de reference = 128 
    glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);//rien pour l'instant ici (donc pas modification du stencil buffer)
     
    glColorMask(1, 1, 1, 1); //réactivation de la couleur 
    glStencilFunc(GL_GREATER, 129, ~0);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
    //ici le code qui affiche un rectangle blanc qui rempli tout l'écran (j'ai pas mis le code pour ne pas encombré) 
    glDisable(GL_STENCIL_TEST);
    glDepthMask(GL_TRUE);
    Si j'ai bien compris :
    - Mon stencil buffer vaut toujours 0, je le modifie jamais.
    - Le rectangle blanc que je dessine ne devrait être affiché qu'au endroit où le stencil buffer vaut plus que 129. Et comme mon stencil buffer vaut 0 partout, il ne sera jamais affiché.

    Pourtant quand j'exécute se bout de code, j'ai un écran tout blanc, pourquoi ?

    Merci d'avance...

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    - Es-tu sûr d'avoir activer le stencil buffer à l'initialisation du context OpenGL ?

    - Combien de bits donnes-tu pour le stencil buffer ?

    - Quel est le résultat si tu passe GL_NEVER à la place de GL_GREATER ?

    - Je ne comprends pas trop ta facon de procéder, j'aurais simplement fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    glEnable(GL_STENCIL_TEST);
    glClear(GL_STENCIL_BUFFER_BIT); //met le stencil buffer à 0
     
    glStencilFunc(GL_ALWAYS, 1, 1); //valeur de reference = 128 
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);//rien pour l'instant ici (donc pas modification du stencil buffer)
     
    glColorMask(1, 1, 1, 1); //réactivation de la couleur 
    glStencilFunc(GL_EQUAL, 1, 1);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
    //ici le code qui affiche un rectangle blanc qui rempli tout l'écran (j'ai pas mis le code pour ne pas encombré) 
    glDisable(GL_STENCIL_TEST);
    glDepthMask(GL_TRUE);
    Jc

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Désolé pour cette réponse tardive

    Je ne comprend pas bien tes 2 premières questions...
    J'active (glEnable) mon stencil buffer en plein milieu de ma boucle qui contient le code OpenGl.

    Quand je met GL_NEVER, je n'ait pas un écran tout blanc...donc normal

    Pour ce qui est de ma façon de procédé je fait comme dans le tuto pour afficher les ombres : http://texel3d.free.fr/opengl/shadow...adowvolume.htm

    J'ai testé avec ta façon et ça fonctionne bien
    Mais je ne comprend pas dutout pourquoi ça ne fonctionne pas avec ma façon ?!

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Plus personne pour m'aider ?

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par casafa
    Plus personne pour m'aider ?
    Montre comment tu initialises OpenGL, ce sera plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Mais je ne comprend pas dutout pourquoi ça ne fonctionne pas avec ma façon ?!
    Le plus simple serait de donner un code complet qui montre le problème

    Jc

  6. #6
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 535
    Points : 5 217
    Points
    5 217
    Par défaut
    Il faut savoir que les opérations sur le stencil buffer sont basée sur le traitement par pixel

    aussi en regardant ton code, j'ai remarqué que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glStencilFunc(GL_ALWAYS, 128, ~0); //valeur de reference = 128 
    glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);//rien pour l'instant ici (donc pas modification du stencil buffer)
    ne servent à rien, puisque tu n'envoie aucun pixel dans le frame buffer
    qui plus est, tu utilises GL_ALWAYS donc le test passe touours, ton 128 est inutile
    avec GL_GREATER l'opération se traduirait comme ça : if((stencil & ~0) > (128 & ~0)) then glStencilOp

    en espérant que tu y vois un peu plus clair

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par shenron666
    ne servent à rien, puisque tu n'envoie aucun pixel dans le frame buffer
    Oui mais justement, il disait que même sans demander l'affichage de quelque chose, après son test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glStencilFunc(GL_GREATER, 129, ~0);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    passe à chaque fois et donc pourquoi (normalement le stencil buffer doit encore être à 0).

    Bien qu'il ait laissé le code que tu mentionnes, c'était volontaire (d'où le commentaire )

    Jc

  8. #8
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 535
    Points : 5 217
    Points
    5 217
    Par défaut
    d'un côté, le code est pas très logique
    mais j'ai beau le tourner / retourner dans tous les sens je n'arrive pas à comprendre pourquoi ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glStencilFunc(GL_GREATER, 129, ~0);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    fait que ça passe alors que le stencil est sensé ne contenir que des 0

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Merci pour vos réponses,

    J'ai refait un peu le code pour que vous compreniez mieux :

    Donc ce code permet d'afficher les ombres des modèles (shadow volume)
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    	//On rempli le sencil buffer
            glDepthMask(0);
            glColorMask(0,0,0,0);
            glDisable(GL_CULL_FACE);
            glEnable(GL_STENCIL_TEST);
    	glClear(GL_STENCIL_BUFFER_BIT);
            glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);
     
            glActiveStencilFaceEXT(GL_BACK);
            glStencilOp(GL_KEEP,            // stencil test fail
                        GL_KEEP,            // depth test fail
                        GL_DECR_WRAP_EXT);  // depth test pass
            glStencilMask(~0);
            glStencilFunc(GL_ALWAYS, 0, ~0);
     
            glActiveStencilFaceEXT(GL_FRONT);
            glStencilOp(GL_KEEP,            // stencil test fail
                        GL_KEEP,            // depth test fail
                        GL_INCR_WRAP_EXT);  // depth test pass
            glStencilMask(~0);
            glStencilFunc(GL_ALWAYS, 0, ~0);
    	CShadowVolume::showShadowVolume(this, entities);
     
     
    	glColorMask(1, 1, 1, 1);
    	glStencilFunc(GL_EQUAL, 0, ~0);
    	glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
     
    	//On dessine un carré blanc juste au zone d'ombre
    	glMatrixMode(GL_PROJECTION);
    	glPushMatrix();
    		glLoadIdentity();
    		glOrtho(0.0, CRendererOGL::getSceneWidth(), CRendererOGL::getSceneHeight(), 0.0, -1.0, 1.0);
    		glMatrixMode(GL_MODELVIEW);
    		glPushMatrix();
    			glLoadIdentity();
    			glBegin(GL_QUADS);
    				glVertex2f(0.0, 0.0);
    				glVertex2f(CRendererOGL::getSceneWidth(), 0.0);
    				glVertex2f(CRendererOGL::getSceneWidth(), CRendererOGL::getSceneHeight());
    				glVertex2f(0.0, CRendererOGL::getSceneHeight());
    			glEnd();
    			glMatrixMode(GL_PROJECTION);
    		glPopMatrix();
    		glMatrixMode(GL_MODELVIEW);
    	glPopMatrix();
     
    	glDisable(GL_STENCIL_TEST);
    	glDepthMask(1);

    Donc pour remplir le stencil buffer, j'utilise le premier code trouvé ici (j'espère que c'est le bon) : http://oss.sgi.com/projects/ogl-samp...l_two_side.txt

    Si je met glStencilFunc(GL_EQUAL, 0, ~0); j'ai un écran tout blanc et pareil si je met glStencilFunc(GL_NOTEQUAL, 0, ~0); !!

Discussions similaires

  1. Réponses: 8
    Dernier message: 23/05/2010, 21h06
  2. Réponses: 3
    Dernier message: 29/09/2007, 09h49
  3. Ma jolie macro fonctionne mais je ne comprends pas pourquoi ^
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/07/2007, 06h06
  4. Réponses: 1
    Dernier message: 22/05/2007, 12h51
  5. [Conception] INSERT fonctionne a moitié, UPDATE Fonctionne, comprends pas?
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 06/09/2006, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo