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

DirectX Discussion :

[HLSL][C++] Lecture du Depth Buffer dans un PS3.0


Sujet :

DirectX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 82
    Points : 71
    Points
    71
    Par défaut [HLSL][C++] Lecture du Depth Buffer dans un PS3.0
    J'initialise une texture qui devra contenir mon z buffer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    V( DXUTGetD3DDevice()->CreateTexture(
    	back_buffer_surface->Width,
    	back_buffer_surface->Height,
    	1,
    	D3DUSAGE_DEPTHSTENCIL,
    	D3DFMT_D24S8,
    	D3DPOOL_DEFAULT,
    	&z_buffer_texture,
    	NULL
    ) );
    z_buffer_texture->GetSurfaceLevel(0,&z_buffer_surface);
    Ensuite, je l'utilise pendant le rendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V( DXUTGetD3DDevice()->SetDepthStencilSurface( z_buffer_surface ) );
    En post traitement, je souhaite l'exploiter dans un pixel shader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    V( _deferred2_effect->SetTexture( texture_depth, z_buffer_texture ) );
     
    sampler sampler_depth = sampler_state 
    {
        texture = <texture_depth>;
        AddressU  = CLAMP;        
        AddressV  = CLAMP;
    };
    [...]
    float depth = tex2D( sampler_depth, tex );
    Et à ce moment là, la valeur de depth est bloqué à 1.0f ou supérieure.

    Comment récupère t on correctement la valeur depth dans un pixel shader ?

    Merci d'avance.
    Xter.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 82
    Points : 71
    Points
    71
    Par défaut
    Merci pour la mise en forme, je n'avais pas trouvé le bouton pour formater le code source.

    Avec PIX, il semblerait, je ne suis pas du tout, que ma surface z buffer n'est pas prise en compte et que le moteur reste sur le z buffer créé au moment de l'initialisation du device.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Merci pour la mise en forme, je n'avais pas trouvé le bouton pour formater le code source.
    C'est le petit bouton #, ou bien les balises [ CODE ] [ /CODE ] si tu veux les taper à la main

    Avec PIX, il semblerait, je ne suis pas du tout, que ma surface z buffer n'est pas prise en compte et que le moteur reste sur le z buffer créé au moment de l'initialisation du device.
    Tu as essayé avec le debug DirectX ? Le reference rasterizer ? Tu as lu la doc concernant les surfaces de depth-stencil (je crois qu'il y a certaines conditions particulières) ?

    http://jeux.developpez.com/faq/direc...LEMES_probleme

  4. #4
    Membre actif Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 296
    Points
    296

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 82
    Points : 71
    Points
    71
    Par défaut
    Merci pour les infos.

    En effet, il est possible d'utiliser une render target pour stocker un Z buffer.

    Mais, je voudrais utiliser le depth buffer géré par la carte video : D3DUSAGE_DEPTHSTENCIL. C'est pour du deferred shading avec un Gbuffer sans positionZ.

    Xter.

  6. #6
    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
    Citation Envoyé par xterminhate
    Comment récupère t on correctement la valeur depth dans un pixel shader ?
    Tu ne peux pas. (du moins pas encore).
    Les depth stencil textures sont une extension non standard de DirectX. Ils ont été introduits sur XBOX, puis porté sous Dx8 par Nvidia puisque le hardware était capable de le faire. Certains runtimes (de Microsoft) empechent l'extension de fonctionner, mais meme quand cela fonctionne le comportement est figé dans le hardware et ne permet que de faire des comparaisons (pour faire des shadow maps quasi exclusivement).

    La seule alternative à l'heure actuelle si tu as vraiment besoin de la valeur de Z est de la stocker toi-meme dans une rendertarget texture.

    Ou une autre solution est d'attendre Direct3D 10, ou il sera possible par la spécification de l'API, de choisir entre les deux comportements (comparaison ou lecture de la valeur de Z).

    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

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 82
    Points : 71
    Points
    71
    Par défaut
    J'en prends note. Je reviens donc à un depth buffer ordinaire.

    Merci.

+ 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. méthode de lecture d'un fichier dans un buffer
    Par Mestoph dans le forum Composants VCL
    Réponses: 6
    Dernier message: 24/02/2006, 10h07
  3. [JList] Lecture des données sauvegardées dans un fichier
    Par Myogtha dans le forum Composants
    Réponses: 7
    Dernier message: 10/06/2004, 21h05
  4. [C#] [.NET] Lecture d'une classe dans un fichier
    Par niPrM dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 08h57
  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