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

Développement 2D, 3D et Jeux Discussion :

Deferred lighting: position original


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 230
    Points
    230
    Par défaut Deferred lighting: position original
    Bonjour,

    Je tente de faire du deferred lighting. J'ai donc fais des textures qui contiennent les différentes composantes necessaires au deferred lighting: diffuse, depth, normal, etc.

    A partir de ces textures, j'aimerais retrouver la position original du pixel en x.y.
    J'ai trouvé ceci sur internet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //récupération de la profondeur de la position original
    float z = tex2D(depthSampler,input.TexCoord).r;
    //calcule de la position original
    float4 position;
    //il faut convertir la position de texture qui est entre 0 et 1 à des coordonnées entre -1 et 1
    position.x = input.TexCoord.x * 2.0f - 1.0f;
    position.y = -(input.TexCoord.y * 2.0f - 1.0f);
    position.z = z;
    position.w = 1.0f;
    //on transforme avec la matrice inverse de la viewProj.
    position = mul(position, InvertViewProjection);
    position = position.w;
    Ref.: http://www.mti.epita.fr/blogs/2008/0...red-rendering/

    Je ne comprends pas les 2 dernières lignes:
    1) Qu'est ce que c'est l'"InvertViewProjection" ? Matrice inverse de projection ? matrice inverse de model view ? les 2 combinés ?
    2) Que fait la ligne "position = position.w" ?

    Merci d'avance.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 937
    Points
    4 937
    Par défaut
    InvertViewProjection : matrice inverse de la matrice viewproj

    position = position.w doit être une erreur, normalement ça serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    position /= position.w;
    vu que la matrice de projection modifie la coordonnée w

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 230
    Points
    230
    Par défaut
    Merci pour ta réponse...mais ma question à propos de "InvertViewProjection" se portais sur la définition de "ViewProjection" et non sur "Invert" (dont j'ai bien compris la signification).

    Qu'est ce que c'est la matrice viewProj ?
    viewProj = modelViewMatrix * projectionMatrix ?

    Si c'est le cas, comment peut-on récupérer la modelViewMatrix en deferred lighting ? On n'a plus cette information... !

    Merci d'avance.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 937
    Points
    4 937
    Par défaut
    non viewproj = view * proj, la matrice model (aussi appelée world) n'a rien à faire la dedans

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 230
    Points
    230
    Par défaut
    Merci, je comprends beaucoup mieux maintenant et désolé pour la réponse tardive, je n'avais plus Internet.

    Il reste une petite chose que je ne comprends pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float z = tex2D(depthSampler,input.TexCoord).r;
    Pourquoi la valeur de "z" se situe très souvent entre 0.95 et 1 ?
    Quand j'ai ceci: glVertex3f(0.0, 0.0, -50.0), comment OpenGL fait-il pour transformer le '-50.0' en une valeur comprise entre 0 et 1 ?

    Merci d'avance.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 937
    Points
    4 937
    Par défaut
    ça c'est du à la façon dont est projeté un point de la scène 3d vers l'espace de l'écran.

    nous avons pour ça 3 matrices:
    - matrice world -> place notre objet de son repère local vers le repère de la scène
    - matrice view -> place notre objet de la scène vers le repère utilisateur
    - matrice proj -> transforme notre scène en un joli plan 2d

    c'est précisément la matrice proj qui va transformer notre monde vu par l'utilisateur (qui est une pyramide tronquée) vers un parallélépipède rectangle de dimension [-1, 1]x[-1, 1]x[0, 1].
    cette transformation d'une pyramide vers un parallélépipède rectangle implique une grande distorsion et cette distorsion n'est pas linéaire.

    grosso modo notre intervalle de [0, 1] pour le z-buffer va être très mal utilisé, on va utilisé 20% de la plage disponible pour 80% des objets à l'écran.

    c'est pourquoi la majorité des valeurs que tu obtiens sont proche de 1.

    je survole l'explication car elle est loin d'être triviale, j'espère que ce que j'ai écrit suffira à la compréhension.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 230
    Points
    230
    Par défaut
    Merci beaucoup pour l'explication.
    J'ai ouvert un post sur le fonctionnement exacte du depth buffer dans OpenGl: ici.

    Maintenant que j'ai toutes les cartes en main pour retrouver la position originale, je ferme cette discution.

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

Discussions similaires

  1. [OpenGL 3.x] Deferred Lighting : Affichage de la sphère?
    Par qnop dans le forum OpenGL
    Réponses: 4
    Dernier message: 09/02/2014, 14h26
  2. [GLSL] deferred shading: position d'origine
    Par zenux dans le forum OpenGL
    Réponses: 28
    Dernier message: 21/06/2010, 07h02
  3. replacer mes vues dans leur positions d'origines
    Par delas dans le forum Eclipse Platform
    Réponses: 3
    Dernier message: 02/10/2007, 12h35
  4. Comment remettre des scrollbar invisible à leurs positions d'origine
    Par avogadro dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/08/2006, 17h13
  5. spot light position
    Par venomelektro dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/08/2004, 15h45

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