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 :

problème Shadow Mapping


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut problème Shadow Mapping
    Bonjour,

    Je suis actuellement en train de mettre en place la méthode de shadowmapping pour générer des ombres. A priori au niveau des transformations et des matrices utilisées, je pense ne pas avoir de problème parce que lorsque je suis dans la passe de rendu, j'arrive à afficher la profondeur de chaque fragment par rapport à la lumière (bien qu'il semble y avoir un problème de clamping.

    Seulement, j'essaye de lire les valeurs de ma shadowmap, mais cela me donne un affichage étrange que je n'arrive pas à interprêter. Je commence donc à douter de ma shadowmap, mais je ne trouve pas de moyen de la vérifier étant donner que c'est calculé offscreen.

    Voici donc mon code :

    Initialisation de la shadowmap et de son FBO
    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
    bool ShadowMapFBO::initUndeprecated(unsigned int WindowWidth, unsigned int WindowHeight) {
     
        // The framebuffer, which regroups 0, 1, or more textures, and 0 or 1 depth buffer.
         glGenFramebuffers(1, &m_fbo);
         glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
     
         // Depth texture. Slower than a depth buffer, but you can sample it later in your shader
         glGenTextures(1, &m_shadowMap);
         glBindTexture(GL_TEXTURE_2D, m_shadowMap);
         glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, WindowWidth, WindowHeight, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     
         glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_shadowMap, 0);
     
         glDrawBuffer(GL_NONE); // No color buffer is drawn to.
     
         // Always check that our framebuffer is ok
         if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
             return false;
     
         return true;
    }
     
    //Bind de la Shadowmap pour écriture avant la première passe (écriture de la shadowmap et Bind de la SM pour lecture avant la passe de rendu : 
     
    void ShadowMapFBO::BindForWriting()
    {
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
    }
     
     
    void ShadowMapFBO::BindForReading(GLenum TextureUnit)
    {
        glActiveTexture(TextureUnit);
        glBindTexture(GL_TEXTURE_2D, m_shadowMap);
    }
    Première passe : calcul de la shadowmap avec le shader associé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void GLScene::computeShadowMap() {
     
        m_shadowmap.BindForWriting();
     
        glClear(GL_DEPTH_BUFFER_BIT);
     
        // La projection light et la projection camera sont identiques
        m_map.draw(projection, cameraview, lightview, m_shadowMapShader, m_gridShader, false, false);
     
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
    }
    Vertex Shader de génération de la ShadowMap :
    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
    #version 330
     
    in vec3 VertexPosition;
    in vec3 VertexNormal;
    in vec2 VertexTextCoord;
     
    // Here, MVP from light space are received
    uniform mat4 projection;
    uniform mat4 model;
    uniform mat4 lightview;
     
     
    void main()
    {
    	// generation shadow map
    	gl_Position = projection * lightview * model * vec4(VertexPosition.xyz, 1.0);
    }
    FS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #version 330
     
    out float fragmentDepth;
     
    void main()
    {
    	// computes a shadowmap
    	fragmentDepth = gl_FragCoord.z;
    }
    Ma question est la suivante : En mettant simplement dans le FragmentShader un float en sortie, est-on sur qu'OPenGL sait qu'il doit écrire dans la DepthTexture qui a été bindée précédemment ?

    Comment puis-je faire pour m'assurer que cette ShadowMap est bien calculée ?

    Merci d'avance !

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Par défaut
    Salut.

    Ton problème est peut être dû à la matrice de projection que tu utilises.

    Personnellement, j'utilises personellement un near à -1 et un far a 1 avec glm::perspective

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut
    Salut,

    Pour ma part, je suis enter 0 et 1000.
    Si je mets mon near à -1, je n'ai plus d'affichage quant au far, si je le réduis trop, je finis par ne plus voir l'intégralité de la scène. Je ne comprends pas, comment peut-on avoir des valeurs si petites ?

    J'ai entendu parlé de linéarisation des shadowcoords pour les repasser les profondeurs entre -1 et 1, est-ce possile d'effectuer ce traitement indépendamment de la projection.

    Pour ma part, j'utilise la même projection pour ma caméra que pour le calcul de la shadowmap du point de vue de la map, est-ce grave ? Je sais que théoriquement, on est sensé le faire avec une projection orthogonale, tout du moins pour les directionnelles, mais cela peut-il avoir un impact aussi important ?

    Lorsque j'essaye d'afficher la profondeur d'un fragment lorsqu'il est projeté en espace lumière (dans la passe de rendu), dans le frag, je fais uniquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    VS : 
    	// Position of the vertex as seen from the light
    	shadowCoord = biasMatrix * projection * lightview * model * vec4(VertexPosition, 1.0);
     
    FS : 
     
    fColor = vec4(vec3(shadowCoord.z), 1.0);

    Et voici ce que j'obtiens :

    http://hpics.li/742ef32

    Ici la lampe est placée (pour les tests) en coordonnée world : (0,0,10), soit pile dans le cube central au dessus de la voiture. Des profondeurs sont calculées, mais elles ne correspondent pas à la projection envoyée.
    Et puis, on a l'impression que tout ce qui est à une distance > 1 dans le plan z de la lumière (vertical dans l'espace world donc) n'est pas pris en compte...

    Je n'y comprends pas grand chose.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Par défaut
    Salut.

    Ce que je te disais, c'est de mettre ton near a 1 et far a -1 pour l'unique calcul de la shadow map, le near a 1 et le far a 1000, je l'utilise pour l'affichage normal ^^.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut
    Ah d'accord, je vais essayer, mais je ne suis pas sur de comprendre : cela ne vas pas limiter la profondeur de la shadowmap ? Cela ne va pas occulter de ma map tous les objets en deçà de ces bornes ? et au même titre que je ne vois plus rien à l'écran quand je suis en rendering, est-ce que ca ne va pas les faire disparaître de ma map ? Promis je vais essayer en tout cas ^^

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut
    Bon,

    j'ai modifié ma projection et je suis passé en orthogonale. J'ai eu quelques discussions théoriques et effectivement, ca ne doit pas marcher avec un tel near et un tel far, sauf si toute ta scène est entre -1 et 1, sinon, presque rien n'est pris en compte dans ta shadowmap.

    J'ai essayé de plaquer cette dernière à la place de mes textures avec
    textureProj(Shadowmap, shadowcoord), et tout est blanc, cela veut probablement dire qu'elle est mal bindée, mais je n'en ai pas l'impression. Peut-il y avoir un conflit entre le FBO par défault et le FBO créé ?

Discussions similaires

  1. Shadow Map - Problème d'Ombres Projetées
    Par 686insomnia686 dans le forum DirectX
    Réponses: 11
    Dernier message: 22/08/2012, 14h57
  2. Problème de shadow mapping
    Par bobbysinger dans le forum OpenGL
    Réponses: 4
    Dernier message: 07/04/2010, 10h28
  3. Réponses: 3
    Dernier message: 21/12/2009, 17h19
  4. Shadow mapping
    Par Pen² dans le forum OpenGL
    Réponses: 4
    Dernier message: 22/04/2005, 14h35
  5. [Struts] Problème de mapping
    Par ArseNic dans le forum Struts 1
    Réponses: 5
    Dernier message: 10/02/2005, 10h11

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