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/GLSL tout ce qui touche aux transformations


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 OpenGL/GLSL tout ce qui touche aux transformations
    Bonjour/bonsoir

    Je m'intéresse en ce moment à la programmation OpenGL et surtout à l'utilisation des VBO et Shaders. Alors mon but était de faire un cube 3D assez simplement avec un VBO qui contient les vertices et les couleurs et un VBO qui contient les indices. Après un glDrawElements, mon cube apparaît.
    Maintenant j'aimerais exécuter des transformations de type zoom/dezoom, déplacement de la vue (donc l'oeil) à droite ou gauche, ainsi que faire une translation et rotation (droite/gauche/haut/bas) à l'aide uniquement des shaders (à priori Vertex Shader dans ce cas).
    Malheureusement, je ne sais pas trop comment mis prendre du côté GLSL et du côté API. En gros, je n'arrive pas trop à savoir quoi faire en GLSL et ce que je dois lier dans l'API au shader pour que cela fonctionne correctement.

    Si quelqu'un a déjà fait ce genre de chose, j'aimerais quelques explications avec pourquoi pas des exemples.

    Merci d'avance.

    EDIT : Précision, j'utilise la bibliothèque GLM pour tout ce qui touche aux mathématiques (librairie inspiré de GLSL : http://glm.g-truc.net/ )

  2. #2
    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
    Bonjour/bonsoir

    [...]
    Maintenant j'aimerais exécuter des transformations de type zoom/dezoom, déplacement de la vue (donc l'oeil) à droite ou gauche, ainsi que faire une translation et rotation (droite/gauche/haut/bas) à l'aide uniquement des shaders (à priori Vertex Shader dans ce cas).
    Malheureusement, je ne sais pas trop comment mis prendre du côté GLSL et du côté API. En gros, je n'arrive pas trop à savoir quoi faire en GLSL et ce que je dois lier dans l'API au shader pour que cela fonctionne correctement.

    Si quelqu'un a déjà fait ce genre de chose, j'aimerais quelques explications avec pourquoi pas des exemples.

    Merci d'avance.

    EDIT : Précision, j'utilise la bibliothèque GLM pour tout ce qui touche aux mathématiques (librairie inspiré de GLSL : http://glm.g-truc.net/ )
    Dans ton shader crée une mat4 uniform qui contient la transformation a appliqué a tout les vertex de ton cube. A chaque fois que tu bouges ton cube tu mets ta matrice à jour coté API avec glUniform4f
    Dans ton shader une multiplication entre la matrice et le vertex devrait faire l'affaire.

    ton vertex shader minimaliste(de tête)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    uniform mat4 matriceTransformation;
     
    void main()
    {
        vec4 positionVertex = vec4(matriceTransformation * gl_Vertex);
        gl_Position = gl_ModelViewProjectionMatrix * positionVertex ;
    }

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut
    Je me trompe peut-être (merci de me corriger si c'est le cas) mais il me semble qu'à partir d'OpenGL 3.2 on doit spécifier nous-même les matrices aux Shader. Faut-il donc s'habituer à spécifier nous-même la matrice gl_ModelViewProjection ?

  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
    Oui je suis d'accord avec toi au niveau de spécifier les matrices aux shaders.
    En gros, je pensais grâce à la librairie GLM créer une matrice de translation par exemple.
    On trouve dans la GLM ceci :

    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
    20
    21
     
    detail::tmat4x4<T> glm::gtx::transform::translate
    (
    detail::tmat4x4< T > const & 	m,
    T 	x,
    T 	y,
    T 	z	 
    )
    Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars.
    From GLM_GTX_transform extension.
     
    et
     
    detail::tmat4x4<T> glm::gtx::transform::translate
    (
    T 	x,
    T 	y,
    T 	z	 
    )
    Builds a translation 4 * 4 matrix created from 3 scalars.
    From GLM_GTX_transform extension.
    Je pensais utiliser la seconde version mais je sais pas trop faire exactement. Mon idée aurait été de faire une matrice 4x4 du côté API :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    glm::mat4  translation = ( 0.0f, 0.0f, 0.0f, 0.0f,
                                       0.0f, 0.0f, 0.0f, 0.0f,
                                       0.0f, 0.0f, 0.0f, 0.0f,
                                       0.0f, 0.0f, 0.0f, 0.0f );
    puis utiliser la fonction que la GLM me propose, disons que je veux une translation de 1.0f sur l'axe des x :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    translation = glm::translate(1.0f, 0.0f, 0.0f);
    Du coté shader, je déclare une variable uniform :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    uniform mat4 translation;
    puis du côté API je lie cette variable uniform avec ma mat4 translation de mon API. Et du côté shader je multiplie ma uniform mat4 par la matrice gl_ModelViewMatrix et gl_Vertex que je stock dans la variable gl_Position.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gl_Position = gl_ModelViewMatrix * gl_Vertex * transformation;
    Vous en pensez quoi ? Est-ce correct ?

  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
    Ta matrice glm::mat4 translation doit être une matrice identité sinon tu aura des problèmes et aussi comme les multiplication de matrices et vecteurs ne sont pas commutatives
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gl_Position = gl_ModelViewMatrix * gl_Vertex * transformation
    risque de poser des problèmes. Fait le en plusieurs étapes comme dans mon post précédent.

  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
    Outch!!! effectivement, j'avais mal tapé ma matrice pourtant j'ai une matrice identité dans mon API que j'appelle pour initialiser mes matrices.
    Sinon je suis Ok aussi pour la multiplication par étape, j'avais zappé ce petit soucis :s

Discussions similaires

  1. insérer du 3ds dans opengl + collisions + tout quoi ;)
    Par Darknicosh dans le forum OpenGL
    Réponses: 5
    Dernier message: 22/04/2005, 15h14
  2. une requete qui fonctionne aux 3/4...
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 22h08
  3. LIKE de tout ce qui n'est pas compris entre a<-&
    Par DjinnS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/07/2003, 13h09

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