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 shaders - Comment récupérer le résultat d'un Fragment shader


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Par défaut OpenGL shaders - Comment récupérer le résultat d'un Fragment shader
    Bonjour à tous

    J'aimerai générer une texture avec une liste de shaders que j'ai créé.
    Ces shaders peuvent être ajoutés et retirés dynamiquement pour créer le rendu.

    La compilation des shaders ne pose pas de soucis, l'activation d'un shader non plus.
    Le problème que j'ai est lorsque je veux activer plusieurs shaders...

    J'aimerai que mon 2e shader utilise la texture générée par le premier

    J'ai donc utilisé cet algo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Pour chaque shader
              Activer le shader
              Dessiner un carré sur la sortie écran avec ma texture plaquée
              Desactiver le shader
              Récupérer le resultat appelant glReadPixel( 0,0, maxX, maxY, buffer )
    FinPour
    Cependant cet algorithme semble incorrect.... donc ma question est :

    Est il possible de spécifier la sortie d'un shader? ( intuitivement je suppose que oui )
    Afin de charger le résultat dans directement dans la texture

    j'ai l'impression que la méthode glRead me renvoie toujours la texture initiale, car quand j'active plusieurs shaders l'affichage que j'obtiens est seulement le résultat du dernier shader et non le résultat du cumul, Les shaders ne travaillent pas sur le buffer d'affichage?

  2. #2
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Si tu affiche ton carré avec toujours la meme texture c'est normal que le resultat que tu obtienne soit celui du dernier shader. La texture que tu dois plaquer lors de la boucle n+1 doit etre la texture resultante du calcul du shader de la boucle n. Il n'y a que pour la premiere fois que tu boucle qu'il faut utiliser la texture d'origine.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Par défaut
    on est bien d'accord sur le principe

    le buffer que le place en paramètre de la fonction glRead est la texture originelle ce qui ( jeme trompe peut etre... ) à normalement pour effet d'écraser les données quelle contient non?

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Si tu veux utiliser la texture generee par un shader dans la passe precedente il va te falloir faire la technique du ping pong: tu as deux textures A et B. Au premier rendu du utilises un FBO qui est bind a B et A mais tu mets seulement B en ecriture (avec la fonction glDrawBuffers) et tu dessines dans la texture B. Au deuxieme rendu tu changes le draw buffer a A et tu bind B en tant que texture pour y acceder dans ton shader (une texture ne peut etre qu'en lecture seul ou ecriture seule et pas les deux a la fois), et tu continues comme ca. Plus de details sur google.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Par défaut
    oki merci beaucoup de ton aide je pense en effet que mon problème viens de la...

    je ne savais pas qu'une texture était uniquement accessible à la lecture quand elle était bindée..

    j'ai juste un doute quand à l'abréviation FBO -> Frame Buffer Output?. Je me renseigne de cette technique de ping pong et te remercie grandement pour l'aide apportée

    je pense vais mettre résolu en attendant de programmer cette technique d'ici la fin de la semaine maxi je pense pour ceux que ca interresserait et qui seraient confronté à ce problème.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 055
    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 055
    Billets dans le blog
    141
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/08/2007, 13h11
  2. Réponses: 16
    Dernier message: 16/08/2007, 15h35
  3. Comment récupérer le résultat d'une requête ?
    Par vito12345 dans le forum JDBC
    Réponses: 1
    Dernier message: 18/02/2007, 10h33
  4. Comment récupérer le résultat d'un time ?
    Par ramislebob dans le forum Linux
    Réponses: 5
    Dernier message: 08/12/2006, 11h37
  5. Réponses: 3
    Dernier message: 24/03/2006, 13h52

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