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 :

problème de Z-test avec les frams buffers


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut problème de Z-test avec les frams buffers
    bonjours à tous

    j'avais chercher une solution pour booster mes couleur de rendu par un shader, mais qui se fasse juste avant le swap-buffer. Pour cela, je fais le rendu de ma frame dans une texture, puis, je l'affiche sur l'ecran avec un shader qui modifie les couleur.

    Le seul ennuis, c'est que lorsque je fais le rendu dans ma texture, le test de profondeur ne fonctionne pas comme prévu. Voici donc ici deux capture d'écran d'un terrain, l'un est directement rendu à l'écran, l'autre est dans une texture pour ensuite modifié les couleur.

    Le code est exactement le même car pour fair le rendu dans la texture, je rajoute seulement avant et après juste le nécessaire pour que cela se fasse dans le fram-buffer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    //DESSIN DIRECTE A L'ECRAN:
    void draw ()
    {
    	//mon code de dessin (bien trop long)
    }
     
     
    //DESSIN DANS LA TEXTURE PUIS AFFICHAGE:
    void draw ()
    {
    	glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, FramId);
     
     
    	//toujours le même code de dessin
     
     
    	glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TextureId, 0);
    	glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
     
    	glBindTexture (GL_TEXTURE_2D, TextureId);
     
    	glUseProgram (PostEffectShaderId);
     
    	glLoadIdentity ();
     
    	glMatrixMode (GL_PROJECTION);
    	gluOrtho2D (0.0, FramDimension.Width, 0.0, FramDimension.Height);
     
    	glBegin (GL_TRIANGLES);
     
    	glTexCoord2f (0.0, 1.0);
    	glVertex2i (0, pFramDimension.Height);
     
    	glTexCoord2f (1.0, 0.0);
    	glVertex2i (FramDimension.Width, 0);
     
    	glTexCoord2f (0.0, 0.0);
    	glVertex2i (0, 0);
     
    	glTexCoord2f (0.0, 1.0);
    	glVertex2i (0, FramDimension.Height);
     
    	glTexCoord2f (1.0, 0.0);
    	glVertex2i (FramDimension.Width, 0);
     
    	glTexCoord2f (1.0, 1.0);
    	glVertex2i (FramDimension.Width, FramDimension.Height);
     
    	glEnd ();
    }
    Voici le code de la creation du fram buffer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void creatFramBuffer (size2i Size)
    {
    	// -------------------------------- INIT TEXTURE
    	glGenTextures (1, &TextureId);
    	glBindTexture (GL_TEXTURE_2D, TextureId);
     
    	glTexImage2D (GL_TEXTURE_2D, 0, 4, Size.Width, Size.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  
    	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);	
    	glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);	
    	glTexParameteri (GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
     
    	// -------------------------------- INIT BUFFER
    	glGenFramebuffersEXT (1, &FramId);
    	glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, FramId);
    	glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TextureId, 0);
     
    	glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
    }
    Sur les captures d'écran, nous pouvons voir que le dessin de la carte s'effectue correctement quand c'est dessiné directement , tandis que sur le l'image au tendance plus rouge, qui est du à ma rectification, on vois que la carte à des problème de profondeur. Même l'eau n'est plus affiché, tandis qu'elle est sensé être dessiné après la carte.

    notes : La carte est dessinés par régions carré mise cote à cote qui sont stocké dans des vertex array, aucun stencil test.

    Savez vous pourquoi j'ai se problème de test de profondeur ? Aurais je oublié quelque chose dans la création de fram-buffer ?


    Je vous remercie de votre lecture ainsi que de vos réponses.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Par défaut
    si tu cherches à réaliser une opération de transformation sur les couleurs donc pixels par pixels alors utiliser un FBO n'est pas vraiment recommandé, ce qui serait tout indiqué serait plutôt d'utiliser un shader et de réaliser ta saturation de couleur dans le fragment shader

    le rendu dans un buffer serait nécessaire si tu réalisais une opération qui nécessite l'accès aux pixels adjacents comme par exemple un filtre 2D qui utilise une convolution d'image.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Bonsoir, et bien, je me disai que cette technique était la plus adapté, car je prévoyais aussi de mettre le Z buffer dans une texture et ainsi pouvoir faire un flou de profondeur dans le même shader.

    En plus, cette technique à quand même un gain énorme en fps lorsque je met des particules avec les shaders qui gère tout seul la transformation de couleur. Mais l'affichage de la carte est un vrai désastre malheureusement.

  4. #4
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Utiliser un FBO est tout à fait recommandé pour ce genre d'opération. Une fois la scène rendu dans ce FBO tu dessine un quad avec la texture liée à ton FBO et tu fais ton traitement de couleurs directement dans le pixel shader.
    Si tu as un problème de test de profondeurs c'est simplement parce que tu as oublié d'attacher un RenderBuffer avec DepthBuffer à ton FBO du coup pas de DepthBuffer, en général dans les tutos sur les FBO ils lient toujours un RenderBuffer pour le Depth donc tu ne devrais pas avoir de mal à trouver ça maintenant que tu sais où est le problème et que tu connais son nom.
    Regarde au niveau du code tout en bas où il y a GL_DEPTH_COMPONENT : http://www.songho.ca/opengl/gl_fbo.html

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    bonjour oxyde356

    Utiliser un FBO est tout à fait recommandé pour ce genre d'opération. Une fois la scène rendu dans ce FBO tu dessine un quad avec la texture liée à ton FBO et tu fais ton traitement de couleurs directement dans le pixel shader.
    C'est exactement ce que je fais , d'autemps plus que le vertex shader n'applique même pas de matrix, donc pas besoin de passé en GL_PROJECTION.


    Si tu as un problème de test de profondeurs c'est simplement parce que tu as oublié d'attacher un RenderBuffer avec DepthBuffer à ton FBO du coup pas de DepthBuffer, en général dans les tutos sur les FBO ils lient toujours un RenderBuffer pour le Depth donc tu ne devrais pas avoir de mal à trouver ça maintenant que tu sais où est le problème et que tu connais son nom.
    Regarde au niveau du code tout en bas où il y a GL_DEPTH_COMPONENT
    Merci beaucoup ! Effectivement, j'avais oublié le render buffer, j'en ai donc ajouté un et çà marche très bien maintenant ! Il me reste plus qu'a chercher un solution pour récupéré le Z-buffer.

  6. #6
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Là, tu as deux solutions, la première c'est d'attacher un deuxième color_attachment à ton fbo pour y lier une deuxième texture et dans ton shader tu y enregistrera le depth manuellement, c'est la version la plus compliqué mais c'est celle qui donne un plus grand contrôle, l'autre solution c'est d'attacher un depth_attachment à ta ton fbo ce qui va automatiquement remplir une texture avec le depth buffer et là tu n'as rien de plus à faire.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 04/05/2011, 12h37
  2. Problème avec les Vertex Buffer Objects
    Par mysth dans le forum OpenGL
    Réponses: 0
    Dernier message: 18/05/2009, 21h31
  3. [Cookies] problème d'en-tête avec les cookies
    Par weldata dans le forum Langage
    Réponses: 1
    Dernier message: 18/05/2007, 22h28
  4. [Avis aux pros !] Problèmes de la VCL avec les threads
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/02/2006, 22h38
  5. Problème sur classe Transformer avec les <!--
    Par tykool dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/01/2006, 10h20

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