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 :

Comment récupérer la position d'un vertex dans un shader GLSL


Sujet :

OpenGL

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Par défaut Comment récupérer la position d'un vertex dans un shader GLSL
    J'aurai besoin de récupérer la position d'un vertex dans l'espace absolue.

    si j'ai bien compris le fonctionnement des shaders:

    gl_Vertex => ce sont les coordonnées du vertex dans l'espace local.

    gl_ModelViewMatrix => la matrice de view (la caméra, en fait )

    gl_ProjectionMatrix => la matrice de projection (la perspective)

    Je vois comme solution de passer en paramètre de shader ma matrice de position de mes objets, celle que je passe avec glMultMatrix() entre des glPushMatrix et glPopMatrix() avant mon affichage.
    Mais je préfère éviter surtout que mon shader doit bien avoir l'info puisque les objets sont dessinés au bon endroit.
    Il y a quelque chose qui m'échappe

    Merci pour 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
    http://bakura.developpez.com/tutorie...ec-opengl-3-x/
    http://bakura.developpez.com/tutorie...ec-opengl-3-x/
    (tu peux utiliser cette manière de procéder même avec OpenGL 2.1)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Par défaut
    le probleme c'est que j'ai essayé la méthode suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /*Vertex program*/
     
    varying vec3 vPos, vNormal;
     
    void main(void){
    	gl_Position = ftransform();
    	gl_FrontColor = gl_Color;
    	vPos = gl_ModelViewMatrix * gl_Vertex;
    	vNormal = gl_NormalMatrix * gl_Normal;
    }
    vPos n'est pas la position dans l'espace absolue mais la position par rapport à la camera
    vNormal n'est pas les normal dans l'espace absolue non plus
    J'ai besion d ces deux info pour ensuite les mettre dans un buffer RGBAfloat32 dans le fragment program (ça je sais faire)
    Mon but est en autre de faire deferred lighting

    Il y vraiment un truc qui m'échappe le code que je vien de mettre est tiré d'un exemple choppé sur le net.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 127
    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 127
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Qu'avez vous comme valeur?

    Si vous demandez espace absolue, c'est que vous ne voulez pas les valeurs en coordonnées ecran, donc pour avoir les valeurs que vous voulez ce serai plus un truc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vPos = gl_ModelMatrix * gl_Vertex;
    ( Sans la vue )
    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.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Qu'avez vous comme valeur?

    Si vous demandez espace absolue, c'est que vous ne voulez pas les valeurs en coordonnées ecran, donc pour avoir les valeurs que vous voulez ce serai plus un truc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vPos = gl_ModelMatrix * gl_Vertex;
    ( Sans la vue )
    C'est exactement ce que je veux!! sauf que gl_ModelMatrix n'existe pas

  6. #6
    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
    Les variables pré-définis dans GLSL sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    uniform mat4 gl_ModelViewMatrix;
    uniform mat4 gl_ProjectionMatrix;
    uniform mat4 gl_ModelViewProjectionMatrix;
    uniform mat4 gl_TextureMatrix[gl_MaxTextureCoords];
    N'hésite pas a regarder de temps en temps la spécification de GLSL pour trouver ce que tu cherche.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 127
    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 127
    Billets dans le blog
    149
    Par défaut
    Ce que je ne comprends pas, c'est pourquoi ne pas faire ce genre de calculs du coté du CPU ... ( Surtout si vous voulez un feedback ).
    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.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Ce que je ne comprends pas, c'est pourquoi ne pas faire ce genre de calculs du coté du CPU ... ( Surtout si vous voulez un feedback ).
    Mon but dans un premier temps est de faire du picking color ou je récupère l'identifiant de l'objet(ça au moins ça marche très bien) et sa position dans l'espace global(là souci)

    Dans un deuxième temps mon objectif est de faire du rendu différé.

    Je pense que je vais arrete de faire du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    glPushMatrix() ;
    glMultMatrix4f(matriceObjet);
    draw
    glPopMatrix();
    et faire passer ma matriceObjet dans le shader comme ça plus de souci.
    Je pense qu'il n'est pas possible de faire autrement. Et puis comme ça quand je passerai à openGL3.x ce serra déjà fais.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 127
    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 127
    Billets dans le blog
    149
    Par défaut
    Oui, pour avoir les matrices séparées, correctement, il faut les passer à la main.
    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.

  10. #10
    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
    Oui passe tes matrices à la main et utilise la librairie GLM qui permet d'avoir des formats avec les spécifications GLSL donc très simple à mettre en parallèle.

    http://glm.g-truc.net/

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Par défaut
    Citation Envoyé par AuraHxC Voir le message
    Oui passe tes matrices à la main et utilise la librairie GLM qui permet d'avoir des formats avec les spécifications GLSL donc très simple à mettre en parallèle.

    http://glm.g-truc.net/
    c'est ce que je suis en train de faire (sans GLM, j'ai déjà ce qu'il faut pour gérer matrice et vecteur) et ça à l'air de donner le résultat attendu pour l'instant.

  12. #12
    Membre éprouvé Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Par défaut
    Salut,

    Si j'ai bien compris tu obtiens la position du vertex dans la position caméra avec la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vPos = gl_ModelViewMatrix * gl_Vertex;
    Utilises-tu sur ta matrice GL_MODELVIEW un gluLookAt en première instruction avant la position par glMultMatrix4f de tes autres objets :
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    glModeMatrix(MODELVIEW);
    gluLookAt( /*position camera*/);
    ....
    glPushMatrix() ;
    glMultMatrix4f(matriceObjet);
    draw();
    glPopMatrix();
    Si c'est le cas pour obtenir comme tu le souhaites la position absolue des objets il faut que tu "retires" l'impacte de la matrice gluLookAt dans ton shader. Pour cela généralement, on passe la matrice inverse de gluLookAt sous forme d'une variable uniform aux shaders.

    Ce qui donnerai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    varying vec3 vPos, vNormal;
    uniform mat4 invLookAt; //inverse de la matrice lookAt
    void main(void){
    	gl_Position = ftransform();
    	gl_FrontColor = gl_Color;
    	vPos = invLookAt * gl_ModelViewMatrix * gl_Vertex;
    	vNormal = gl_NormalMatrix * gl_Normal;
    }
    Dans ce cas là, la matrice obtenue par : invLookAt * gl_ModelViewMatrix correspond bien seulement à la matrice matriceObjet (position absolue) passé par un glMultMatrix4f et non à la matrice gluLookAt * matriceObjet (position caméra).

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Par défaut
    Citation Envoyé par Robxley Voir le message
    Salut,

    Si j'ai bien compris tu obtiens la position du vertex dans la position caméra avec la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vPos = gl_ModelViewMatrix * gl_Vertex;
    Utilises-tu sur ta matrice GL_MODELVIEW un gluLookAt en première instruction avant la position par glMultMatrix4f de tes autres objets

    ...

    Si c'est le cas pour obtenir comme tu le souhaites la position absolue des objets il faut que tu "retires" l'impacte de la matrice gluLookAt dans ton shader. Pour cela généralement, on passe la matrice inverse de gluLookAt sous forme d'une variable uniform aux shaders.

    ....
    Dans ce cas là, la matrice obtenue par : invLookAt * gl_ModelViewMatrix correspond bien seulement à la matrice matriceObjet (position absolue) passé par un glMultMatrix4f et non à la matrice gluLookAt * matriceObjet (position caméra).
    C'est exactement ça.

    J'ai décidé de passé la matrice de position de mes objets, modelMatrix, celle que je passe avec glMultMatrix4f
    et donc j'obtient la position comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vec3 position = modelMatrix * gl_Vertex;
    Merci pour toutes vos réponses, je vais mettre la discutions en Résolu

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

Discussions similaires

  1. Comment calculer la position et la normale dans le vertex shader
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 16/04/2013, 00h46

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