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 :

[OpenGL 3.3] Multi render target


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 [OpenGL 3.3] Multi render target
    Bonjour,

    Je viens de découvrir les geometry shaders (GLSL) et j'aimerais faire ceci:

    * C++: appeler OpenGL pour afficher un triangle
    * Vertex shader: transformer ce triangle par une matrix de view & projection
    * Geometry shader: dupliquer trois fois mon triangle et appliquer une matrice de scale différente à chaque itération
    * Pixel shader: rendre les trois triangles dans une "depth texture" (FBO) différente.

    J'ai pensé à deux solutions mais aucune ne fonctionne:
    - Créer un FBO avec deux depth textures. Apparement, c'est impossible pcq on peut en attacher qu'une seule: GL_DEPTH_ATTACHMENT contrairement aux color textures où on peut en avoir plusieurs (GL_COLOR_ATTACHMENT[0-15])
    - Créer deux FBO avec un depth texture chacun. Si je ne dit pas de bêtise: je ne peux pas faire deux "glBindFramebuffer" avant d'afficher mon triangle.

    Que faut-il faire ?
    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
    27 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 156
    Billets dans le blog
    151
    Par défaut
    Bonjour,

    Si vraiment vous en avez besoin (par exemple, un shadowmap) vous pouvez toujours sauvegarder la profondeur dans une texture (même si on la passe en couleur attachment).
    Sinon, un pixel shader peut écrire dans plusieurs sorties à la fois (soit, dans plusieurs textures attachées).
    Pour cela, il faut avoir attaché plusieurs textures aux FBOs.
    De plus, il faut spécifier les sorties que l'on utilise avec glDrawBuffers().

    Pour le pixel shader, il faut que celui-ci contienne le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    layout(location=0) out vec4 positionOut;
    pour associer cette variable à la texture attachée en couleur 0.
    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 é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 pour la réponse.
    En effet, c'est pour des shadowmap que j'ai besoin d'implémenter cette technique.

    Je vois assez bien comment fonctionne le rendu dans plusieurs target d'un même FBO avec glDrawBuffers().
    Mon problème: je ne savais pas qu'il y avait moyen d'accéder à la depth value dans un pixel shader et donc je ne trouvais pas de solution. Je viens de voir que s'est possible via "gl_FragDepth".

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    Tu es sur que gl_FragDepth n'est pas deprecated en OpenGL 3.3?

  5. #5
    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
    Je me suis posé la même question

    D'après http://www.opengl.org/sdk/docs/mangl..._FragDepth.xml, la valeur existe bien en OpenGL 3.3 (mais elle est p-e deprecated ?)

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 156
    Billets dans le blog
    151
    Par défaut
    Dans la spécification du langage : http://www.opengl.org/registry/doc/G...30.6.clean.pdf il n'y a pas de mention dépréciée pour cette variable (point 7.2)
    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.

  7. #7
    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
    Parfait. Je peux donc créer une texture de depth sur un color attachement d'un FBO.

  8. #8
    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
    Sinon il y a le layerez rendering ... tu attache carrément une texture array de de depth texture et avec le geometry shader, tu spécifies le layer par la variable gl_Layer pour chacun de tes triangles. Disponible depuis OpenGL 4.2 (ou 4.1 je sais plus trop ...) Notes que c'est encore plus optimisé si tu fait du geometry instancing (depuis OpenGL 4.2 minimum) au lieu de creer tes trois triangles a partir d'une seul instance du geometry shader. A l'heure actuel, c'est ainsi que je fait le rendu d'un cascaded shadow maping, et j'ai pas trouvé plus rapide.

  9. #9
    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
    Apparement, j'ai dit une bêtise: il faut utiliser gl_FragCoord.z pour lire la depth value et non pas gl_FragDepth.
    J'essaye d'écrire cette depth value dans ma texture GL_COLOR_ATTACHMENT0 mais je ne vois pas comment faire.

    - Quel doit être mon format de texture ? GL_DEPTH_COMPONENT32 ? GL_DEPTH_COMPONENT24 ? GL_DEPTH_COMPONENT16 ? GL_RGBA ? Autre ?
    - D'après la doc "gl_FragCoord.z" est un float ? Un float en GLSL, est-ce que c'est toujours 32 bits ?
    De plus il me semble avoir lu que la représentation d'un GL_DEPTH_COMPONENTx n'est pas la même que celle d'un float. Donc comment copier mon float dans une texture au format GL_DEPTH_COMPONENT32 ?

    Merci LastSpear pour cette information. Je vais commencer par faire une shadow map de base avant d'attaquer ta solution qui me parait vraiment bien

  10. #10
    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
    Si ça interesse quelqu'un, j'ai utilisé une texture avec un internal format 'GL_R32F' pour stocker la depth value.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/06/2007, 08h49
  2. OpenGL multi fenetre sans glViewport
    Par Groove dans le forum OpenGL
    Réponses: 12
    Dernier message: 22/02/2007, 11h19
  3. Basic OpenGL Rendering using LWJGL
    Par ibelieve dans le forum 3D
    Réponses: 1
    Dernier message: 28/02/2006, 09h44
  4. OpenGL et les cartes multi-écrans
    Par jcs2 dans le forum OpenGL
    Réponses: 1
    Dernier message: 14/02/2006, 14h08
  5. Réponses: 4
    Dernier message: 20/04/2005, 13h30

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