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 :

[GLSL 1.2] probleme attribute et glGetAttribLocation


Sujet :

OpenGL

  1. #1
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Par défaut [GLSL 1.2] probleme attribute et glGetAttribLocation
    Bonjour !

    Je programme actuellement en utilisant opengl 2.1 (GLSL 1.2), mais j'essaye progressivement de faire du "forward compatible" en m'affranchissant des variables deprecated comme 'gl_Vertex' ou 'gl_ModelViewMatrix'.

    Pour commencer, j'aimerais fournir a mon vertex shader les matrices de projection et de modelisation (modelview) pour ne plus utiliser la pile de matrice opengl.

    Si j'ai bien compris, je dois passer la matrice de projection en tant qu'uniform, car elle ne change pas pendant le rendu, et la matrice de modelisation en tant que "attribute" car elle change pour chaque sommet.

    J'ai donc commence a m'essayer aux variables 'attribute' avec ce petit shader :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // la matrice de projection :
    uniform mat4 projection_matrix;
     
    attribute vec4 offset;
     
    varying vec4 color;
     
    void main()
    {
        color = gl_Color;
        gl_Position = projection_matrix*gl_ModelViewMatrix*( gl_Vertex + offset );
    }
    Pas de souci pour l'uniform, mais je n'arrive pas a passer mon "vec4 offset", donc j'ai essaye de debugger en affichant le nom de la variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    GLint o = glGetAttribLocation(*shader, "offset");
     
    GLsizei l,s;
    char name[20];
    GLenum e;
    glGetActiveAttrib(*shader, o ,  4 , &l, &s, &e, name );
    cout<<name<<endl;
    L'execution de ce code me donne :
    "gl_"

    alors que je m'attendrais a avoir le nom du vec4 : "offset".

    Est-ce que j'ai fait quelque chose de travers ? Est-ce que le probleme pourrait venir d'ailleurs ? J'utilise un VBO pour passer mes couleurs et mes coordonnes de somme, est-il possible qu'il y ait interference ?

    Merci pour votre attention et vos reponses

  2. #2
    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
    Bonjour Jejej et bienvenue

    Je vais commencé par la fin.

    L'execution de ce code me donne : "gl_" alors que je m'attendrais a avoir le nom du vec4 : "offset".
    Cela indique qu'OpenGL n'arrive pas à trouver ta variable dans tes shaders (parce que le nom est incorrect ou parce que la compilation des shaders a échoué ou parce que le link du programme a échoué, etc.). Il faut tester chaque étape pour vérifier qu'il n'y a pas d'erreur.
    En particulier, utilises glGetShaderInfoLog pour vérifier que la compilation des shaders est réussit.

    Si j'ai bien compris, je dois passer la matrice de projection en tant qu'uniform, car elle ne change pas pendant le rendu, et la matrice de modelisation en tant que "attribute" car elle change pour chaque sommet.
    Non, toutes tes matrices sont des uniform. Imagine s'il fallait founir 1 matrice par vertex, ça serait énorme.
    Petite remarque, calculer le produit de matrice dans les shaders n'est pas une bonne chose. Ca oblige a refaire le même calcul pour chaque vertex. Il vaut mieux fournir une seule matrice.


    Si c'est pour programmer sur desktop, opengl 2.x est quand même relativement vieux. Par contre, si c'est pour de l'embarqué c'est bon

  3. #3
    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
    Tout comme en haut, je te mets un vertex shader basic que l'on utilise :
    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
     
    #version 330
    /* Entrée */
    in vec3 vertexPosition_in;
    in vec3 color_in;
     
    /* Variables Uniform */
    uniform mat4 projectionMatrix;
    uniform mat4 viewMatrix;
     
    /* Sorties */
    out vec3 color_v;
     
    void
    main()
    {
        gl_Position = projectionMatrix * viewMatrix * vec4( vertexPosition_in, 1.0 );
        color_v = color_in;
    }
    Par contre c'est du shader 330, donc je ne sais pas si tu peux en faire. Si non, je pense que la seule chose qui passe pas c'est les attributs in/out qui sont varying logiquement.

  4. #4
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Par défaut
    Merci pour vos réponses !

    Ah, j'ai compris pour le passage des matrices ! Du coup, ça implique d’appeler un shader pour chaque objet. Pour l'instant j'avais un shader pour tout le programme (programme qui consiste à afficher 2 cubes qui tournent sur eux-même ). D'ailleurs, ça sera plus pratique comme ça.
    Par contre, je pense qu'il faut quand même passer les 2 matrices séparément, parce que certains calculs pour la lumière nécessitent la modelview matrix... Du coup, peut-être que le moins lourd c'est de passer 3 matrices, la projection, la modélisation et la multiplication des deux. Voire uniquement la muliplication des deux et la modelview, vu que (pour l'instant) je n'ai pas d'autre utilité pour la matrice de projection.

    Merci pour ton exemple AuraHxC. Par contre, d'accord pour remplacer le "out" par un "varying", mais les "in" du vertex shader doivent être remplacés par un "attribute" non ?

    ( Après vérifications dans la spec, le type "in/out" n'existe pas dans GLSL 1.2. Il y est dans 1.5 (et avant aussi surement), tandis que les types "attribute" et "varying" sont deprecated. Je suppose que c'est pour uniformiser les transferts "client->vertex shader" et les transferts inter-shaders. Pas de geometry shader non plus.

    Mais vu que j'utilise les ordinateurs de l'école, pas le choix c'est Opengl 2.1 et GLSL 1.2 sur Solaris Du coup c'est rapé pour la forward compatibility !

  5. #5
    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
    Si tu utilises les vbo, tu peux passer des tableaux (vertex, texture, indices, etc.) contenant les données de tous les objets puis jouer avec les paramètres de début et de fin de glDrawElements/glDrawArrays pour sélection l'objet que tu veux dessiner. Et mettre à jour les matrices entre chaque objet.

    Pour le passage des matrices, oui, c'est mieux de passer plusieurs matrices en paramètre plutôt que de faire les calculs dans les shaders.

    Et oui, avec GLSL 1.2, tu dois utiliser uniform, attribute et varying.

Discussions similaires

  1. requete nommé JPA probleme attribut
    Par cris83500 dans le forum JPA
    Réponses: 1
    Dernier message: 13/01/2010, 12h01
  2. probleme attribution classe css
    Par calitom dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 20/11/2007, 17h07
  3. probleme avec les attributs de type ID
    Par ben83 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 01/01/2006, 21h49
  4. [Debutant(e)]Eclipse 3.1, probleme d'attribut
    Par sophie86 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 28/11/2005, 21h21
  5. Probleme de gestion d'attributs et de tables
    Par Mut dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 30/05/2005, 19h05

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