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 :

[GLSL] Calculer le z-buffer


Sujet :

OpenGL

  1. #1
    Membre chevronné Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Par défaut [GLSL] Calculer le z-buffer
    Bonjour,

    Je suis en train d'implémenter l'ombrage par shadow mapping en GLSL. Dans une première passe, j'obtiens correctement le zbuffer à partir du point de vue de la source lumineuse. Le zbuffer est attaché à un FBO en tant que texture, et est calculé par OpenGL (les fonctions fixes du pipeline).

    Lors du rendu de la scéne à partir de la caméra, la position des vertices dans le repère-fenêtre de la source lumineuse (positionLightSpace) est calculée dans le vertex shader, comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // in clip plane
    positionLightSpace = gl_ProjectionMatrix * lightMatrix * modelMatrix * gl_Vertex;
     
    // perspective division
    positionLightSpace.xyz /=  positionLightSpace.w;
     
    // wiewport transform
       positionLightSpace.x = (positionLightSpace.x +1.0)*( viewport.z/2.0) + viewport.x;
       positionLightSpace.y = (positionLightSpace.y +1.0)*( viewport.w/2.0) + viewport.y;
    (lightMatrix * modelMatrix) est équivalent à gl_ModelViewMatrix de la première passe. Le viewport est passé en uniform vec4 (x,y,width, heigth).

    Cette position est interpolée est transférée dans le fragment shader, pour pouvoir y faire la comparaison avec le zbuffer-lumière. Les valeurs x et y sont corrects, mais pas celle z. Ce qui donne des ombres incorrectes.

    J'ai l'impression que la valeur z est calculée autrement par les fonctions fixes d'OpenGL, mais je ne sais pas en quoi. Quelque chose m'échappe ...

    Avez-vous des idées?

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Essaye de faire le "perspective division" dans le fragment shader. C'est une operation non lineaire donc normalement (mais bon j'en suis pas sur) tu peux pas le faire dans le vertex shader et l'interpoler pour le fragment shader, tu dois directement le calculer dans le fragment shader pour chaque pixel.

    Sinon y'a peut-etre aussi le soucis que le z est des fois entre [-1,1] ou [0,1] dependant dans quelle convention tu te trouves.

  3. #3
    Membre chevronné Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Par défaut
    Merci.

    Comme tu l'as dit, mon problème était bien celui du z buffer. Dans le clip plane les valeurs sont dans [-1, 1], alors que aprés la transformation du viewport, elles sont dans [0,1].

    Les transformations dans le vertex shader fonctionnent. Je les ai placées là en pensant que c'était moins "couteux". Par contre, je ne sais pas si on obtient des meilleurs résultats en les effectuant dans le fragment shader. A tester.

    Avec l'interpolation de z, il y des problèmes pour les ombres projetées sur des larges polygones. Mais avec les petits, les résultats sont satisfaisants.

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

Discussions similaires

  1. Réponses: 33
    Dernier message: 22/02/2012, 12h46
  2. [GLSL] Calculer un angle entre deux vecteurs.
    Par who_knows dans le forum OpenGL
    Réponses: 5
    Dernier message: 05/05/2010, 17h40
  3. Hardware buffer / attribute glsl
    Par MatRem dans le forum Ogre
    Réponses: 0
    Dernier message: 27/06/2008, 18h39
  4. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  5. Alpha blending et Z-buffer directx 8
    Par Cesar4 dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h58

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