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 :

Comment est calculée et stockée la depth value ?


Sujet :

OpenGL

  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 Comment est calculée et stockée la depth value ?
    Bonjour,

    J'ai un FBO avec une texture GL_DEPTH_ATTACHMENT. Quand je lis cette texture dans un shader GLSL (texture2D), je constate que la valeur est toujours comprise entre 0.0 (zNear) et 1.0 (zFar).
    Pourtant si je prends un point 3D visible sur mon écran et que je le multiple par la projection matrix, j'obtiendrai toujours un résultat entre -1.0 (zNear) et 1.0 (zFar).

    Qui fait la transformation des coordonnées [-1.0, 1.0] à [0.0, 1.0] pour stocker la depth value dans ma texture ? Est-ce qu'on a un contrôle sur cette partie ?
    Quel est le calcul exécuté pour faire cette transformation ? Est-ce linéaire (depthValue * 0.5 + 0.5) ?

    Merci d'avance.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Cette transformation n'est pas liée à la texture de profondeur, mais à tout tampons souhaitant être affiché à l'écran. La transformation est (indirectement ?) liée au glViewport(), car au final, on passera les coordonnées dans l'espace écran (pour être affichés sur l'écran ).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  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 cette reponse.

    J ai enfin trouve que c est la fonction glDepthRange qui permet de definir cette transformation qui est lineaire. Et comme tu l as dit cela est bien fait au meme moment que le glViewPort.

  4. #4
    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
    Le stockage des valeurs dans le depth buffer n'est pas linéaire (selon la distance au centre de vue).

    De plus le format est à priori "opaque" même si c'est souvent rapporté à un nombre entre 0 et 1.

    Ce qui se passe : OpenGL (et les autres APIs comme DirectX) définissent un viewport qui a des dimensions précises dans l'espace en 3D et qui définit ce qui est visible à l'écran. Ce viewport est consistant avec les maths utilisés dans le Vertex shader/Vertex program.

    Ensuite, la valeur d'un sommet (X,Y,Z,W) est converti dans l'espace écran et l'espace du depth buffer pour être comparé à la valeur du depth buffer déja stockée. En gros X,Y,Z,W deviennent X/W,Y/W,Z/W, 1/W. Cette transformation est intéressante parce que à cause de la projection conique les coordonnées ne sont pas linéaires sur l'espace de l'écran, mais les valeurs **/W le sont.

    Quand on calcule Z/W, la notion de ZNear et ZFar disparaissent (Z et W sont tous les deux fonctions de ZNear et ZFar). Par contre on sait qu'on est à ZNear quand Z/W == 0. et ZFar quand Z/W == 1 (c'est parfois l'inverse suivant la convention du depth buffer).

    Ces deux limites définissent le champ d'application du Depth buffer. Si les valeurs stockés dans le depth buffer sont des entiers (formats D16 et D24 ou D32), alors la totalité des valeurs entières sont utilisés avec 0 qui mappe la valeur Z/W == 0, et MAX_INT qui mappe la valeur Z/W == 1. Puis toutes les valeurs intermédiaires (linéaires en Z/W). On peut voir ça comme la version non normalisée de la valeur Z/W dans l'espace écran.
    Il y a aussi des formats de depth buffer au format flottant sur les GPUs modernes (dans ce cas pas de dénormalisation, 0.0f mappe 0, et 1.0f mappe 1).

    Si une valeur est linéaire en Z/W, alors elle n'est pas linéaire en Z (sauf si W est une constante bien entendu mais ce n'est pas le cas en projection conique classique). Ça a des implications sur la précision (si le depth buffer est un format entier toute la précision est concentrée autour du ZNear).

    Autre implication importante est que si tu lis les valeurs du depth buffer dans un shader plus tard.. Tu dois faire la re-linéarisation a la main si ton algorithme est sensible au fait que ton info de profondeur soit linéaire. Ce n'est pas forcément compliqué, tu fais l'opération inverse à Z/W, en réintroduisant les termes de ta matrice de projection.

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/05/2009, 19h49
  2. Comprendre comment le checksum est calculé
    Par Fred.77 dans le forum C
    Réponses: 4
    Dernier message: 27/10/2007, 13h58
  3. [Débutant] [Info] Comment est stocké un objet flash ?
    Par orelero dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 20/10/2005, 12h22
  4. Comment est financé developpez.com ?
    Par BuG dans le forum Evolutions du club
    Réponses: 9
    Dernier message: 19/06/2003, 11h03
  5. Réponses: 5
    Dernier message: 25/03/2003, 17h27

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