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 :

Contenir une ombre ds un plan : PB DE STENCIL !


Sujet :

OpenGL

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut Contenir une ombre ds un plan : PB DE STENCIL !
    Bonjour a tous, j'ai vraiment un gros probleme, que je n'arrive pas a resoudre depuis plusieurs jours ...

    Les algos pour affcher des ombres sont connus, et censés etre simples d'utilisation.
    J'ai pris des modeles pour etablir une classe de gestion des ombres (appelées SHADOW).
    HORS MON OMBRE SORT TOUJOURS DU PLAN QUI EST CENSé LA CONTENIR.

    Je vais detailler l'algorithme.
    Normalement c'est simple, mais je cherche sans jms trouver
    POuvez vous m'aider la dessus ? ? Un grand merci :

    PS : c'est long mais c'est parceque je détaille tout, en commentant. J'en ai tellement marre de pas trouver ...

    Voici ce que je met dans la boucle principale d'affichage (myDraw()) :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
     
    /* On fixe le plan qui va supporter les ombres */
    shadow.setShadowedFloor(lePlan);
    /* NB : le plan est un objet tout simple (un QUAD) */
     
    /* Affecte le stencil buffer pour ce plan : */
    shadow.initStencilForFloor();
     
    // AFFICHAGE DU PLAN avec une texture
    shadow.drawPlane(my_textures[0]);
     
    /* AFFICHAGE DE LOMBRE */
    float objectTranslation[3] = {-20,0,0} ; 
    glPushMatrix();
    shadow.drawShadow(c,0.2,lightPosition, objectTranslation);
    glPopMatrix();
     
    // Affichage de l'objet qui cree lombre ......
     
    //Maintenant, detaillons les focntions importantes de la classe ombre :
    // (DANS LA CLASSE Shadow)
     
     
    /* SIMPLEMENT : PLACE 1 dans le Stencil Buffer ou est tracé le plan (sans l'afficher) */
    void Shadow::initStencilForFloor(){
    	/* The shadow will be bounded to the ground */
    	// Turn off writing to the Color Buffer and Depth Buffer
    	// We want to draw to the Stencil Buffer only
    	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
    	//glDepthMask(GL_FALSE);
    	glDisable(GL_DEPTH_TEST);
     
    	// Enable the Stencil Buffer
    	glEnable(GL_STENCIL_TEST);
     
    	// Set 1 into the stencil buffer
    	glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
    	glStencilFunc(GL_ALWAYS, 1, 0xffffffff);
     
    	// Trace the floor only to set the stencil values to 1	
    	//glCallList(thePlane);
     
    	glPushMatrix();
    	glRotated(-90,1,0,0);
    	plan.afficheGL();
    	glPopMatrix();
     
    	// Turn on Color Buffer and Depth Buffer
    	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
    	//glDepthMask(GL_TRUE);
    	glEnable(GL_DEPTH_TEST);
    	glDisable(GL_STENCIL_TEST);
    }
     
    /* 
    Prend un objet cube, une opacité pour l'ombre, la position de la lumiere, et le deplace de l'objet (eventuellement).
     
    Cette fonction se contente de calculer l'objet ombre et de l'afficher.
    ON L'affiche uniquement quand le Stencil = 1 (donc ca devrait marcher !!!!).
    Or, ca l'affiche sur tout l'ecran. Miséricorde, help !!
    */
     
     
    void Shadow::drawShadow(Cube c, float opacity, float lightPosition[4], float objectTranslation[4]){
    	glEnable(GL_STENCIL_TEST);
     
                    /* LE TEST QUI DEVRAIT TOUT FAIRE : */
    	glStencilFunc(GL_EQUAL,1,0x11111111f); 
    	glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP); // indique que le test réussi toujours 
                    /* Ombre semie transparente */
    	glEnable(GL_BLEND);
    	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    	glDisable(GL_LIGHTING);
    	glDisable(GL_TEXTURE_2D);
    	glDisable(GL_DEPTH_TEST);
    	/* Couleur de l'ombre */
    	glColor4f(.5,.5,.5,opacity);
     
    	glPushMatrix(); 
    	{
    	/* On se place ds un nveau repere avec la matrice de projection */	  
    	  glMultMatrixf(matriceProjection(lightPosition));
     
    	  /* Avoid Z Fighting */
    	  glTranslated(0,0.025,0);	  
    	  glTranslated(objectTranslation[0], objectTranslation[1], objectTranslation[2]);	  
                     /* Dessine l'ombre du cube (soit le cube dans le nveau repere */
    	  c.afficheGL();  
    	}
    	glPopMatrix();	
     
    	glEnable(GL_DEPTH_TEST);
    	glEnable(GL_TEXTURE_2D);
    	glDisable(GL_BLEND);
    	glEnable(GL_LIGHTING);
    	glDisable(GL_STENCIL_TEST);
    }

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    hop j'ai eut le même probleme car ... je n'avait pas dit d'utiliser le buffer stencil
    si tu utilise glut essaye en ajoutant le buffer stencil a l'initialisation en même temps que le buffer de couleur et de profondeur
    @+

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut Merci mais....
    .... je ne comprend pas trop ce que tu veux dire...

    Pour toi, ajouter, le stencil buffer a l'initilisation c'est faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    ??
    Parceque ca je le fait dans ma fonction de tracage (myDisplay).

    Dans la fonction d'initialisation je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glClearStencil(0.0);
    Et voila, sinon au sein meme de la boucle d'affichage, j'active bien le stencil quand je dois m'en servir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glEnable(GL_STENCIL_TEST);
    Donc je ne sais pas si c'est une question d'activation du stencil buffer, ca m'a pas l'air ca.

    Merci pour ton aide tout de meme.

    A plus.

  4. #4
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    non non ce que je veut dire c'est faire un truc genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glutInit(GL_COLOR_BUFFER | GL_DEPTH_BUFFER | GL_STENCIL_BUFFER)
    enfin ca doit etre un truc de ce genre la (j'ai pas ma doc...)
    sinon si tu bosse en win32 la je sais pas comment faire mais il doit faloire aller regarder du coté du pixelformat

    @+

  5. #5
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    hop voila j'ai trouvé pour glut c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL);

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Merci bcp bafman c'était ca en effet, dans ma fonction main.

    Formidable, j'avais cherché la dessus 3 jours sans jms trouver ....
    (enfin le main n'était pas de moi et j'avais jms penser a regarder dedans).

    Heureusement quil y en a des comme toi qui ont eu le tour

    Merciiii encore et a plus.

    stalex

  7. #7
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    de rien on est la pour ca

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mettre une application en premier plan
    Par portu dans le forum API, COM et SDKs
    Réponses: 15
    Dernier message: 23/02/2005, 15h39
  2. Réponses: 2
    Dernier message: 07/02/2005, 16h43
  3. [GD] Réaliser une ombre
    Par Atomicfryer dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 03/02/2005, 16h35
  4. Dessiner une image en arrière plan d'1 MDI Main Frame
    Par Yacine95000 dans le forum MFC
    Réponses: 3
    Dernier message: 14/06/2004, 10h22
  5. [MFC] mettre une fenêtre en 1er plan
    Par bigboomshakala dans le forum MFC
    Réponses: 4
    Dernier message: 14/05/2004, 16h39

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