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 :

Depth buffer, fonctionnement


Sujet :

OpenGL

  1. #1
    Membre éclairé
    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
    Par défaut Depth buffer, fonctionnement
    Bonjour,

    J'essaye de comprendre comment fonctionne le depth buffer en OpenGL mais je ne m'en sort pas. Je trouve 50 formules différentes sur le net, grrrrr.

    Dans la doc officiel: http://www.opengl.org/resources/faq/...epthbuffer.htm, voila ce que je trouve:
    The viewport transformation scales and offsets by the depth range (Assume it to be [0, 1]) and then scales by s = (2n-1) where n is the bit depth of the depth buffer:
    Zw = s * [ (We / Ze) * f*n/(f-n) + 0.5 * (f+n)/(f-n) + 0.5 ]
    Si j'ai bien compris, Zw devrais se trouver entre 0 et 65535 avec un depth buffer de 16 bits?!
    Pourquoi ce n'est pas le cas avec les données suivantes:
    n = 1
    f = 10
    Ze = 5
    We = 1
    Zw= 65 535 * ((((1.0 / 5.0) * 10 * 1) / (10 - 1)) + ((0.5 * (10 + 1)) / (10 - 1)) + 0.5) = 87 380

    Merci d'avance...

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Par défaut
    y'a une erreur dans cette formule, ou meme plusieurs:

    si je suis bien reveillé: (f+n)/(f-n) > 1 il me semble.

    donc:
    0.5 * (f+n)/(f-n) + 0.5 > 1

    donc ca pêche déjà parce que de l'autre côté un ajoute un truc qui n'a aucune chance d'être négatif. (ou alors c'est la qu'on craque)

    parce que du coup on fait Zw = s * x avec x > 1 donc on débordera toujours de s.

  3. #3
    Membre éclairé
    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
    Par défaut
    Oui en effet, ton raisonnement me semble correct.

    - Est-ce la formule qui est fausse ? Même sur opengl.org ? Dans ce cas, il me reste quoi comme solution à part le sucuide ?
    - Où alors je n'ai pas compris le sens de la fomule et elle n'est pas censé renvoyer un chiffre entre 0 et 2^n-1 ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Par défaut
    je ne sais pas, rajouter des couches de googleage ne fera pas de mal.
    j'ai bien aimé la petite explication de fa7:
    http://www.developpez.net/forums/d10...engl/z-buffer/

    http://www.codermind.fr/articles/Dep...-tutorial.html

    ...

  5. #5
    Membre Expert

    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
    Par défaut
    Citation Envoyé par zenux Voir le message
    Oui en effet, ton raisonnement me semble correct.

    - Est-ce la formule qui est fausse ? Même sur opengl.org ? Dans ce cas, il me reste quoi comme solution à part le sucuide ?
    - Où alors je n'ai pas compris le sens de la fomule et elle n'est pas censé renvoyer un chiffre entre 0 et 2^n-1 ?
    Tu peux relire cet article pour une autre vision des choses :
    http://www.codermind.fr/articles/Dep...-tutorial.html

    Le near plane c'est quand z = 0, le far plane c'est quand z/w = 1. (w étant la distance positive depuis l'oeil ou centre de projection en utilisant mes notations).

    Le problème de l'article d'OGL.org (et ton problème) c'est qu'il repose à fond sur les conventions OpenGL et donc nécessite de bien comprendre ce qu'elles recouvrent (eye space, clip space et.). Notamment un point important c'est que le frustum est défini comme étant dans les Z négatifs de l'eye space OpenGL. Donc déjà si tu choisis un Ze positif pour ton point à projeter il sera nécessairement en dehors de ton frustum.

    Refais les calculs avec Ze/We = -5 par exemple. (ou tu peux choisir Ze/We = -1 et Ze/We = -10 pour vérifier que la formule est correcte pour les near et far values).

    LeGreg

    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

  6. #6
    Membre éclairé
    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
    Par défaut
    Merci beaucoup à vous deux, j'arrive à calculer la valeur stocké dans le z-buffer d'OpenGL.
    Pour ceux que ça interesse (et surtout comme pense bête pour moi ):

    Données:
    n = 1
    f = 10
    Ve(Xe=0.0, Ye=0.0, Ze=-5.0, We=1.0)

    Méthode OpenGL.org:
    Zc = -Ze*(f+n)/(f-n)-We*2*f*n/(f-n) = 3.88888889 //(projectionMatrix*Ve).z
    Wc = 5 //(projectionMatrix*Ve).w
    Zndc = Zc/Wc = 0.777777778
    Viewport transformation (assume it to be [0, 1]):
    Zw = (Zndc+1)*0.5 = 0.888888889

    Méthode Codermind.fr:
    w = -Ze = 5.0
    z/w = (f-(n*f)/w)/(f-n) = (10-(1*10)/5.0)/(10-1) = 0.888888889

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

Discussions similaires

  1. Depth buffer dans texutre ( opengl )
    Par Rastacouéne dans le forum OpenGL
    Réponses: 43
    Dernier message: 22/07/2008, 20h22
  2. fbo et depth buffer
    Par casafa dans le forum OpenGL
    Réponses: 1
    Dernier message: 27/06/2007, 09h25
  3. [HLSL][C++] Lecture du Depth Buffer dans un PS3.0
    Par xterminhate dans le forum DirectX
    Réponses: 6
    Dernier message: 26/09/2006, 00h34
  4. Comment tester un point du depth buffer.
    Par Pyou dans le forum DirectX
    Réponses: 2
    Dernier message: 02/10/2005, 21h17
  5. A propos depth buffer
    Par j.yves dans le forum DirectX
    Réponses: 1
    Dernier message: 03/12/2002, 00h41

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