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 :

Shadow mapping et couche alpha


Sujet :

OpenGL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut Shadow mapping et couche alpha
    Je viens d'implémenter le shadowmapping en GLSL. Ca fonctionne très bien sauf que l'ombre d'un quad texturé avec une texture avec couche alpha donne une ombre pleine.

    Par exemple si mon quad à une texture grillage mon ombre serra comme si j'avais un mur plein
    .
    Je voudrai savoir ce qu'il faut faire pour que mon ombre corresponde au grillage de ma texture.

    J'ai pensé utiliser un shader avec gl_FragDepth mais je ne sais pas comment faire.

    Merci de votre aide.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 118
    Points : 118
    Points
    118
    Par défaut
    Il suffit d'activer le blending et l'alpha-test lors du rendu de ta shadow-map pour que les trou apparaissent comme lors du rendu dans le buffer "point de vu de la caméra".
    Ainsi les profondeurs seront correctes.
    Pas besoin de shader spécifique pour cela.

  3. #3
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 528
    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 528
    Points : 5 198
    Points
    5 198
    Par défaut
    lorsque tu "calcules" l'ombre de ton grillage, tu fais bien le rendu de ton grillage avec la transparence ?
    sinon peut-etre que la transparence n'est pas à 100% avec l'alpha-test ça devrait être bon comme le suggère sebh

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    Il me semble bien que l'alpha test soit activé.

    Je vais vérifier

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    Je viens de regarder mon code et l'alpha test est bien activer avec GL_ALPHA_TEST. ainsi que le blending avec GL_BLEND

    Je comprend pas mon problème

  6. #6
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Syl_20 Voir le message
    Je viens de regarder mon code et l'alpha test est bien activer avec GL_ALPHA_TEST. ainsi que le blending avec GL_BLEND

    Je comprend pas mon problème
    le blending ne sert à rien et est contre productif avec les ombres (tu ne peux stocker qu'une seule valeur de profondeur par pixel !).

    Assures toi que ton pixel shader sort bien la bonne valeur d'alpha pour passer ou échouer l'alpha test.

  7. #7
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 528
    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 528
    Points : 5 198
    Points
    5 198
    Par défaut
    il faudrait que tu affiches le résultat de ta génération du shadow buffer
    si ton grillage ne laisse passer aucun test comme le suggère LeGreg tu te retrouve avec un quad occludant la totalité de la lumière
    alors que cette dernière devrait passer entre les mailles

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    Pour faire le rendu de ma depthmap je n'utilise aucun shader. J'utilise un FBO
    Le souci est que je ne peu pas l'afficher. J'obtiens une image entièrement blanche

  9. #9
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Syl_20 Voir le message
    Pour faire le rendu de ma depthmap je n'utilise aucun shader. J'utilise un FBO
    Quel est le rapport entre le FBO et le shader ?

    Tu utilises GLSL d'après ton premier poste. Quel est le programme GLSL que tu utilises pour ta première passe (objet troué dans ta shadowmap).
    Pour ta deuxième passe ? Quel est ton test alpha ?

    LeGreg

  10. #10
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 528
    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 528
    Points : 5 198
    Points
    5 198
    Par défaut
    Citation Envoyé par Syl_20 Voir le message
    J'obtiens une image entièrement blanche
    ton image contient quel type de valeurs ? des flottants ?
    logiquement j'aurai tendance à penser qu'il faut que tu convertisses ton image générée à partir de tes tests de profondeur en prenant en compte les valeurs min et max qu'elle contient

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    ton image contient quel type de valeurs ? des flottants ?
    logiquement j'aurai tendance à penser qu'il faut que tu convertisses ton image générée à partir de tes tests de profondeur en prenant en compte les valeurs min et max qu'elle contient
    Tu me pose une colle.

    Je la crée comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glTexImage2D( OpenGL::TEXTURE2D, 0,  GL_DEPTH_COMPONENT24, tX, tY,  0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0 )
    et ensuite un fbo pour la génération de la depthmap avec en initialisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    glBindFramebuffer(GL_FRAMEBUFFER,frameBufferID ); 
    // création du tampon de profondeur
    glBindRenderbuffer(GL_RENDERBUFFER,renderBufferID );
        glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT,tX,tY);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBufferID); 
    // ajout d'une texture à rendre
     
    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, textureT, textureID);
    glDrawBuffer(GL_NONE);
    glReadBuffer(GL_NONE);
    et une image pour le résultat:
    pour info c'est normal qu'il n'y ai pas d'ombre sur l'eau
    on vois bien que les ombres des particules à droite son carré et que l'ombre du "soleil" blanc (en parti sur l'eau)est aussi carré. sinon le reste est normal

  12. #12
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Je sais pas si c'est ton cas, mais ce genre de problème apparait avec les ATI et les derniers pilotes depuis quelques temps (depuis 8.9 je crois).
    A priori il suffit d'avoir un color buffer dans le FBO et pas seulement un depth buffer (même si a priori ça sert à rien pour le shadowmapping ...).

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par MatRem Voir le message
    Je sais pas si c'est ton cas, mais ce genre de problème apparait avec les ATI et les derniers pilotes depuis quelques temps (depuis 8.9 je crois).
    A priori il suffit d'avoir un color buffer dans le FBO et pas seulement un depth buffer (même si a priori ça sert à rien pour le shadowmapping ...).
    J'ai une NVidia 8700
    Mon FBO n'a pas de color buffer, je vais essayé d'en mettre un. On ne sais jamais

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    Je te remercie, MatRem j'ai réussi!

    voici la preuve par l'image:


    Par contre je ne suis pas encore satisfait de mon FBO. J'ai du faire 2 image: une pour la depth map et aussi une color map ce qui me semble pas optimal.
    Quelqu'un , champion en FBO openGL aurait' il une meilleure idée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    glBindFramebuffer(GL_FRAMEBUFFER,frameBufferID ); 
    glBindRenderbuffer(GL_RENDERBUFFER,renderBufferID );
        glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT,tX,tY);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, OpenGL::RENDERBUFFER, renderBufferID);
    // la texture de depthmap
    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE2D, textureID);
    // la texture color
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE2D, textureColorID);

Discussions similaires

  1. comment manipuler la couche alpha d'un .png
    Par bilel dans le forum C++Builder
    Réponses: 1
    Dernier message: 18/07/2005, 14h40
  2. couche alpha avec directdraw
    Par pepedimancho dans le forum DirectX
    Réponses: 4
    Dernier message: 14/06/2005, 18h11
  3. Shadow mapping
    Par Pen² dans le forum OpenGL
    Réponses: 4
    Dernier message: 22/04/2005, 14h35
  4. Comment afficher un Bitmap contenant une couche alpha ?
    Par pwozniak dans le forum Composants VCL
    Réponses: 9
    Dernier message: 17/01/2005, 19h55
  5. Combiner plusieurs textures avec couches alpha
    Par TibobiT dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/05/2004, 15h20

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