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 :

[débutant] shadow volume


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 25
    Par défaut [débutant] shadow volume
    Etant donné qu'il s'agit d'autre chose que du stencil buffer, je préfère créer une autre conversation!

    Dans les techniques de shadow volume, en utilisant le double passe, (cf. NEHE), on dessine en toute fin de la fonction un rectangle:

    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
    void TracerOmbre(vertex_type A, vertex_type B)
    {
    
            glPushAttrib( GL_ALL_ATTRIB_BITS );
    	glDisable( GL_LIGHTING );					// Turn Off Lighting
    	glDepthMask( GL_FALSE );					// Turn Off Writing To The Depth-Buffer
    	glDepthFunc( GL_LEQUAL );
    	glEnable(GL_STENCIL_TEST);					// Turn On Stencil Buffer Testing
    	glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );		// Don't Draw Into The Colour Buffer
    	glStencilFunc( GL_ALWAYS, 1, 0xFFFFFFFF );
    
    
    	// First Pass. Increase Stencil Value In The Shadow
    	glFrontFace( GL_CCW );
    	glStencilOp( GL_KEEP, GL_KEEP, GL_INCR );
            TracerProjection( A, B);
    
    
    
      	// Second Pass. Decrease Stencil Value In The Shadow
    	glFrontFace( GL_CW );
    	glStencilOp( GL_KEEP, GL_KEEP, GL_DECR );
                TracerProjection( A, B);  
    
    
    
    	glFrontFace( GL_CCW );
    	glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );	// Enable Rendering To Colour Buffer For All Components
    
    	// Draw A Shadowing Rectangle Covering The Entire Screen
            glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
    	glColor4f( 1.0f, 0.5f, 1.0f, 0.4f );                    //rose
            glEnable( GL_BLEND );
    	glStencilFunc( GL_NOTEQUAL, 0, 0xFFFFFFFF );
    	glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
    	glPushMatrix();
    	glLoadIdentity();
            glBegin( GL_TRIANGLE_STRIP );
    		glVertex3f(-10.1f, 10.1f,0.2f);
    		glVertex3f(-10.1f,-10.1f,0.2f);
    		glVertex3f( 10.1f, 10.1f,0.2f);
    		glVertex3f( 10.1f,-10.1f,0.2f);
    	glEnd();
     	glPopMatrix();
            glPopAttrib();
    Il me semble que ce plan doit couvrir la vu de la fenetre.
    J'utilise des commandes au clavier pour bouger dans ma scène. Ce rectangle doit aussi bouger en fonction de mes commandes de manière à toujours cacher mon point de vu?

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 577
    Par défaut
    c'est un polygone qui doit recouvrir tout la vue, un peu comme la visière d'un casque, car avec le stencil il va te servir à reproduire les intersections du ou des shadow volumes avec les objets de ta scène
    donc il faut qu'il soit toujours devant toi
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Membre averti
    Inscrit en
    Août 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 25
    Par défaut
    Donc si j'ai bien compris, mon plan doit etre parallele à mon sol?

    visière = plan parallele au sol.....

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 577
    Par défaut
    non, perpendiculaire si tu regardes à l'horizontal
    coplanaire au near
    arf je suis nul pour expliquer ces trucs là
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Membre averti
    Inscrit en
    Août 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 25
    Par défaut
    D'ac!

    Mais comment tu définies la position de ce plan?

    derrière la lumière, entre l'objet et la lumière, devant l'objet et la lumière???

    Je commence à m'y perdre

  6. #6
    Membre averti
    Inscrit en
    Août 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 25
    Par défaut
    Au passage je précise mon gluPerspective:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gluPerspective (CAMERA_ANGLE, (GLfloat) screen_width / (GLfloat) screen_height, 0.01,100);
    mon repère est l'axe Z perpendiculaire à mon plan.
    plan positionné en 0 sur z. et le centre du repère est le centre de mon plan.
    cylindre placé au centre de mon plan.

    avec la fonction suivante:

    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
    50
    51
    52
    53
    54
    void TracerOmbre(vertex_type A, vertex_type B)
    {
     
            glPushAttrib( GL_ALL_ATTRIB_BITS );
    	glDisable( GL_LIGHTING );					// Turn Off Lighting
    	glDepthMask( GL_FALSE );					// Turn Off Writing To The Depth-Buffer
    	glDepthFunc( GL_LEQUAL );
    	glEnable(GL_STENCIL_TEST);					// Turn On Stencil Buffer Testing
    	glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );		// Don't Draw Into The Colour Buffer
    	glStencilFunc( GL_ALWAYS, 1, 0xFFFFFFFF );
     
     
    	// First Pass. Increase Stencil Value In The Shadow
    	glFrontFace( GL_CCW );
    	glStencilOp( GL_KEEP, GL_KEEP, GL_INCR );
            TracerProjection( A, B);
     
     
     
       	// Second Pass. Decrease Stencil Value In The Shadow
     	glFrontFace( GL_CW );
     	glStencilOp( GL_KEEP, GL_KEEP, GL_DECR );
            //TracerProjection( A, B);
     
     
     
    	glFrontFace( GL_CCW );
    	glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );	// Enable Rendering To Colour Buffer For All Components
     
    	// Draw A Shadowing Rectangle Covering The Entire Screen
            glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
            GLfloat Rose[] = {1.0f, 0.5f, 1.0f, 0.04f};
            //GLfloat Noir[] = {0.0f, 0.0f, 0.0f, 0.004f};
            glColor4fv( Rose );
            glEnable( GL_BLEND );
            glStencilFunc( GL_NOTEQUAL, 1, 0xFFFFFFFF );
    	glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
    	glPushMatrix();
    	glLoadIdentity();
            glBegin( GL_TRIANGLE_STRIP );
     
            	/*rectangle vertical face à la caméra*/
                 glVertex3f(0.1f, -10.0f,-10.0);
    	glVertex3f(0.1f,10.0f,-10.0);
    	glVertex3f( 0.1f, -10.0f,10.0);
    	glVertex3f( 0.1f,10.0f,10.0);
     
            glEnd();
            glPopMatrix();
            glPopAttrib();
     
     
     
    }
    Jetez un coup d'oeuil sur le rectangle que j'utilise positionné face à l'obsvervateur.

    merci merci de m'aider!

Discussions similaires

  1. Shadow volume : ombre sur l'obj
    Par zenux dans le forum OpenGL
    Réponses: 8
    Dernier message: 18/06/2007, 13h00
  2. Réponses: 6
    Dernier message: 28/05/2007, 10h26
  3. Shadow volume : est-ce le bon choix ?
    Par casafa dans le forum OpenGL
    Réponses: 3
    Dernier message: 13/04/2007, 22h49
  4. Shadow volume ou shadow mapping ?
    Par zenux dans le forum Moteurs 3D
    Réponses: 8
    Dernier message: 14/03/2007, 12h34
  5. problème avec les shadows volumes
    Par chabfive dans le forum OpenGL
    Réponses: 12
    Dernier message: 11/01/2006, 22h19

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