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] Sortie de shaders


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 [OpenGL 3.3] Sortie de shaders
    Bonjour,

    Pour mon moteur, sous OpenGL 3.3, en Core Profile, je m'attaque a la gestion des shaders. J'arrive déjà à récupérer tous les uniforms ainsi que tous attributes avec toutes les infos qui suivent grâce aux fonctions suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    - glGetActiveAttrib()
    - glGetActiveUniform()
    J'aimerais faire de même pour les sorties de shaders (out), notamment afin d'éffectuer divers contrôles et tout se qui va avec!

    Si quelqu'un à une idée sur la façon de faire je lui serais reconnaissant!

    Merci d'avance!

  2. #2
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    J'ai du mal a comprendre ce que tu veux exactement mais les out dans les shaders sont logiquement pas récupérable (enfin jamais vu ça).
    Un attribut out dans le vertex shader sera un attribut in dans le pixel shader (sauf gl_position qui de toute façon n'est pas défini en out par toi même) et dans le pixel shader, tu définis un seul attribut out qui va recevoir la couleur final.
    Si quelqu'un d'autre voit ce que tu veux tant mieux sinon essaie de préciser avec un exemple

  3. #3
    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
    Je vais essayer de m'expliquer plus clairement. Pour cela je vais poser quelques acquis (n'hésiter pas si je me trompe) :

    - Contrairement à quand tu dis "tu définis un seul attribut out qui va recevoir la couleur final.", il est possible de définir plusieurs out (voir ce turo de bakura sur developpez.com).

    - Récupérer ces out permet ensuite de les utiliser conjointement avec les framebuffers, plusieurs out permet notamment de faire du MRT (multi render target), utile dans certaines techniques comme le Deferred Shading, etc.

    - Il est possible de récupérer les sorties mais pas de façon automatiques, en effet il faut connaître le nom et ensuite utiliser la fonction glGetFragDataLocation.



    Moi, ce que j'aimerais faire c'est, dans mon système haut niveau (entendre par là "plus" que l'API OpenGL), récupérer automatiquement toutes ces sorties avec les infos qui vont avec comme le type de la sortie (vec2, vec3...).
    Faire cela est possible avec les uniforms et les attributs (voir mon premier post)! Ainsi une fois mon shader linker je peux faire plein de tests en mode debug comme vérifier que les infos des VBOs (à savoir position, normal, etc) correspondront bien avec les attributs attendus par le shader. Ainsi j'évite énormément de bugs!

    Voila, s'il reste des points obscurs n'hésiter pas

  4. #4
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Woki, je dormirais moins bête ce soir, je connaissais pas ce côté là des shaders.
    Par contre est ce que finalement ce que tu demande n'est pas plus un soucis de design de ton code plus que d'OpenGL en lui même ?
    Dans tous les cas, j'ai pas trop d'idée dans l'immédiat mais peut être que quelqu'un d'autre en aura une

  5. #5
    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
    Oui c'est peut-être mon design mais c'était afin d'effectuer des tests supplémentaires.

    Mais si quelqu'un à une solution quand même je suis toujours preneur!

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    glGetFragDataLocation permet d'utiliser plusieurs buffers de sortie des Fragment Shaders, pas de "lire" les sorties du Fragment Shader (tout au moins pas directement). Voit le chapitre "User-Defined Fragment Shader Outputs" de "OpenGL programming guide" (p. 729-730).

    glGetActiveAttrib et glGetActiveUniform permettent juste de récupérer des infos de base (nom, type de variable, position, taille) sur les attributs et uniforms (i j'ai bien compris, j'ai jamais utilisé). Ça permet pas réellement de déboguer.

    A mon avis, pour faire du vrai déboguage, c'est à dire récupérer les informations générés par les shaders, il faut :
    - utiliser glReadPixels pour les sorties du Fragment Shader. Tu peux diriger la sortie que tu veux en utilisant plusieurs buffer ou mettre une variable int uniform qui va sélectionner dynamiquement la sortie
    - pour le Vertex Shader, c'est plus compliqué. Il n'y a pas à ma connaissance de fonction permettant de le lire directement. Donc le plus simple, à mon avis (mais jamais testé) est de créé un Fragment Shader de même taille que la sortie du Vertex Shader et qui copie à l'identique la sortie du Vertex Shader.

    Sinon, il existe des outils de débogage pour les shaders (mais jamais testé)

Discussions similaires

  1. Tutoriels OpenGL ogldev en français : les shaders
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 14/04/2019, 21h17
  2. Réponses: 10
    Dernier message: 13/04/2006, 15h54
  3. Réponses: 1
    Dernier message: 06/04/2006, 17h04
  4. Shaders avec openGL 1.5
    Par Fa7 dans le forum OpenGL
    Réponses: 1
    Dernier message: 16/03/2006, 17h05
  5. OpenGL/C++/Shader ne fonctionnant pas
    Par Guildem dans le forum OpenGL
    Réponses: 13
    Dernier message: 06/10/2005, 09h21

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