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 :

[Shader GLSL] Marqueur sur cylindre


Sujet :

OpenGL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut [Shader GLSL] Marqueur sur cylindre
    Bonjour.

    Je cherche depuis quelques jours à réaliser un shader permettant l'affichage d'une sorte de marqueur qui bougerait le long d'un cylindre au fil du temps.
    Le problème principal étant que je n'arrive pas à "sélectionner" un intervalle du cylindre (sur la tranche, soit un autre cylindre) pour ensuite le faire se déplacer (en revanche j'arrive à faire se déplacer un morceau vertical du cylindre, même si le déplacement est saccadé).

    Pourriez vous me donner une piste de réflexion ? Car là, je commencer à couler

  2. #2
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    Salut,

    je ne suis pas sûr de bien tout comprendre (as-tu des images de ce que tu veux obtenir?) mais:
    as-tu essayé avec une texture (transparente sauf à l'endroit de ton marqueur) dont tu fais varier les coordonées à chaque frame?

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    A vrai dire, je viens de commencer l'apprentissage des shaders presque au feeling. J'ai lu la doc éparpillée sur le web, mais je n'ai pas trop de connaissances encore ^^

    Je n'ai pas d'image, mais je pense que tu as compris l'idée générale. La possibilité d'une texture ne m'était pas venue à l'idée, je vais voir ce que je peux en faire, merci beaucoup

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Dans le doute, je rajoute une image du résultat approximatif que je désire obtenir :

    Le cylindre rouge devrait pouvoir bouger le long du noir, mais je ne vois pas comment sélectionner cette portion...

  5. #5
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    OK, là je vois mieux

    je te conseille un truc tout simple:

    - tu crées ton cylindre noir, disons de diamètre 5.0 et de longueur 20.0
    - tu crées un second cylindre, très légèrement plus large (diamètre 5.01) et de longueur 5.0

    comme le second cylindre est un petit peu plus large, il s'affichera "par dessus" le noir. si la différence reste faible tu auras l'impression de n'avoir qu'un seul cylindre.

    apres tu fais glisser le petit cylindre le long du grand, comme tu le souhaites

  6. #6
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    Citation Envoyé par ShevchenKik Voir le message
    OK, là je vois mieux

    je te conseille un truc tout simple:

    - tu crées ton cylindre noir, disons de diamètre 5.0 et de longueur 20.0
    - tu crées un second cylindre, très légèrement plus large (diamètre 5.01) et de longueur 5.0

    comme le second cylindre est un petit peu plus large, il s'affichera "par dessus" le noir. si la différence reste faible tu auras l'impression de n'avoir qu'un seul cylindre.

    apres tu fais glisser le petit cylindre le long du grand, comme tu le souhaites
    beuark
    tu a pensé au risque de z fighting avec ta technique ?

    pour faire ce qu'il veut, il faut que le cylindre ait des coordonnées de texture, et utiliser une texture qu'il fait translater en modifiant la matrice de texture, tout simplement
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses.

    Une précision, je ne peux pas me permettre de rajouter un cylindre pour l'utilisation future de ce code
    En revanche, l'application de texture me paraît approprié, je continue donc de fouiner de ce côté, je reviendrai si j'ai un souci

  8. #8
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    bon bon, c'est pas très élegant soit, c'était juste histoire de proposer une alternative à la méthode utilisant les textures que j'avais évoquée avant...

    Mais bon comme quoi deux avis valent mieux qu'un

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour

    Aprés m'être penché sur les textures, j'ai deux problèmes assez contraignants (essentiellement du au manque d'informations à ce sujet sur le Oueb <_<) :
    Comment dois-je passer ma texture au shader ?
    Et comment puis-je faire bouger cette texture ensuite ?

    Merci d'avance

  10. #10
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    Pour ton exemple, tu n'as pas nécessairement besoin d'utiliser de shaders, mais pour répondre à ta question:

    1. Dans ton vertex shader, tu récupères les coordonées de textures (que tu as assignées à chaque vertex en utilisant glTexcoord()). Code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void main()
    {
    	// Clip-space transformation
    	gl_Position = ftransform();	
     
    	// Texture coordinates transformation
    	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    }
    2. Dans ton fragment shader, tu déclares un paramètre sampler2D avant ta fonction main. Si tu ne fais pas de multitexturing OpenGL saura automatiquement que c'est la texture assignée à ton objet. Ensuite dans ton main tu récupères la couleur de cette texture et tu l'assignes à ton fragment (là je fais simple, on remplace la couleur de ton cylindre par celle de ta texture, pas d'éclairage donc). Code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    uniform sampler2D tex0;
     
    void main()
    {	
            vec4 textureColor = texture2D(tex0, gl_TexCoord[0].st);
    	gl_FragColor = textureColor ;
    }
    Après, avec ou sans shader, pour faire bouger ta texture tu peux soit changer directement les coordonées de texture lorsque tu les assignes avec glTexCoord, ou alors, comme l'a suggeré bafman, modifier ta matrice de textures, par exemple en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    glMatrixMode(GL_TEXTURE)
    glTranslatef(x, y, 0) 
    glMatrixMode(GL_MODELVIEW)
    //...dessin du cylindre
    et tu incrémentes x, y, ou les deux à chaque frame

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci... mais j'ai encore un problème.

    Je code avec OSG, je me suis donc appuyé en partie sur ce tutoriel, et finalement je pense m'être mis sur une mauvaise piste..

    Le code des shaders correspondaient avec ce que j'avais avant, le souci vient donc du fait d'"associer les coordonnées de la texture à chaque vertex en utilisant glTexCoord()"... est-ce que tu pourrais expliciter ce point ?


    edit : en fait, j'ai compris l'exemple, le principe et tout ce qui va avec maintenant ^^
    Pratiquement terminé, je change mes coords de texture et j'essaye de faire bouger tout ça

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour.

    Avant de poser ma question, je vais résumer ce que j'ai fait jusqu'à maintenant.

    J'ai créé un cylindre en définissant ses vertices et j'ai appliqué une texture par dessus, avec des coordonnées de textures.
    J'aimerais maintenant à l'aide de mes shaders faire bouger cette texture sur un axe en fonction du temps.
    Dois je utiliser "gl_MultiTexCoord0.AXE = blabla..." pour cela ? Car mes essais n'ont jusque là rien donnés..

    edit : Si quelqu'un a des précisions pour faire bouger une texture depuis un shader, je suis toujours preneur.

  13. #13
    Membre habitué Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Points : 177
    Points
    177
    Par défaut
    Euh, la réponse de ShevchenKik ne te conviens vraiment pas ?..
    Je vois mal ce qu'on pourrait expliquer de plus que lui :p

    En tout cas, je ne sais pas d'oùtu sors le gl_MultiTexCoord0.AXE
    Surement une histoire avec la géneration automatique des coordonées de texture mais dans ton cas tu n'en as pas besoin.
    Reflechir peut s'averer utile, sisi.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/07/2006, 12h09
  2. Forme des marqueurs sur courbe
    Par anneso108 dans le forum SAP Crystal Reports
    Réponses: 10
    Dernier message: 05/04/2006, 23h08

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