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 :

Dessiner une sphère avec un vertex shader


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut Dessiner une sphère avec un vertex shader
    Bonjour à tous, je cherche une méthode pour dessiner une sphère à partir d'un nombre minimum de triangles, 2 par exemple. J'utilise JOGL et GLSL et je pense qu'il y a moyen de créer un vertex shader pour réaliser cela. J'ai quelques notions en développement de vertex shader mais la je ne vois pas comment faire. Merci de votre aide

  2. #2
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    Tu ne peux pas creer de géométrie dans un vertex shader.
    Par contre, a priori, c'est possible dans le geometry shader, qui est tout récent et donc pas encore trés disponible.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut
    Je ne cherche pas à créer de nouveaux vertices mais modifier les vertices existant pour donner l'apparence d'une sphère

  4. #4
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Avec deux triangles, ta sphère aura l'air carré quoi que tu fasses.

    Si tu dois vraiment te limiter à deux triangles, une solution c'est d'utiliser le billboarding, tu traces un rectangle qui couvre l'aire de ta sphère et tu ajoutes une texture de sphère dessus. Avec le normal mapping tu peux même faire des calculs d'éclairage dessus qui aient l'air correct. Avec le transparency antialiasing (ou alpha blending) tu peux même avoir les bords antialiasés. Avec le registre depth output (dans le pixel shader), tu peux même avoir une occlusion correcte (mais avec une perte de performance). Etc..

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    avec un shader , tu peux aussi faire quelque chose du genre

    -> dessiner un cube englobant de ta sphere.


    vertex_shader : sortie en uniform MYPOS de la position du vertex dans le repere de la camera

    pixel_shader : tu utilises MYPOS et le centre de vue de la camera (0,0,0) pour calculer un rayon. tu cherches alors si ce rayon a une intersection avec la sphere (exprimee dans le repere de la camera ==> en gros tu cherche la distance du centre de la sphere dans le repere camera et tu compares au rayon)

    si il n'y a pas d'intersection tu n'affiches pas le pixel.

    -> je crois qu il doit y avoir une fonction "killpixel" ou quelque chose du genre
    -> sinon a default tu utilises l alpha blending , mais attention au depth buffer qui prendra la profondeur du cube et pas de la sphere !

  6. #6
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -> je crois qu il doit y avoir une fonction "killpixel" ou quelque chose du genre
    Il s'agit de discard(), qui dès qu'elle est appelée stoppe l'exécution du pixel shader. Quand elle est appelé le pixel shader arrête son exécution sans mettre à jour le framebuffer, ce qui fait que le pixel correspondant n'est pas mis à jour ("transparent, donc)

    Pour ce qui est de créer une sphère à partir d'un cube, il est ausi possible de partir dans le sens inverse que ce que fait smashy:
    - 1. On a un cube de départ, qui au final sera notre cube "englobé" (et non plus "englobeant"
    - 2. Dans le vertex shader, chaque sommet du cube est projeté sur la sphere englobeante: si O est le centre du cube et A le vertex en course de traitement, le vecteur OA (normalisé) * r donne A', qui est le projeté de A sur la sphere englobeante de rayon r.
    - 3. Ca marche au mieux si la sphere est vraiment englobeante. C#est à dire que les 8 sommets du cube sont déjà sur la sphere. Il faut donc choisir r = la demi-diagonale du cube
    - 4. Pour avoir une belle sphere lisse, il faut diviser chaque face du cube de départ pour pouvoir travailler sur suffisament de vertex. C#est peut être là le probleme par rapport à la méthode de mappy qui à priori marche avec 8 sommets, mais nécéssite plus de calculs par pixel

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Citation Envoyé par ShevchenKik Voir le message
    - 4. Pour avoir une belle sphere lisse, il faut diviser chaque face du cube de départ pour pouvoir travailler sur suffisament de vertex. C#est peut être là le probleme par rapport à la méthode de mappy qui à priori marche avec 8 sommets, mais nécéssite plus de calculs par pixel
    Effectivement, ma methode traite un certains nombre de pixels inutiles, mais le probleme initial est de faire le dessin avec un minimum de triangles .. il faut donc eviter au maximum les subdivisions.

    De plus ma methode donne une sphere exacte et non une approximation.

    En revanche, si econcomiser des pixels inutiles (sans tous les supprimer) et conserver une sphere exacte, on peut travailler avec d'autres volumes ENGLOBANT que le cube (approximation de la sphere) qui permette de transferer des calculs du pixel shader vers le vertex shader.

    Note que l on peut partir dans le sens contraire et calculer un rectangle (a plat ce coup ci) qui sera le rectangle ENGLOBANT de la projection a l ecran du CUBE ENGLOBANT mais la ca demande plus de calculs pour un gain ridicule
    (avec le back face culling, seuls trois faces du cube sont affichees donc 6 triangles)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Effectivement, ma methode traite un certains nombre de pixels inutiles, mais le probleme initial est de faire le dessin avec un minimum de triangles .. il faut donc eviter au maximum les subdivisions.

    De plus ma methode donne une sphere exacte et non une approximation.
    Oui vu comme ca je suis entièrement d'accord avec toi, c'est même une méthode à laquelle je n'avais jamais pensé et qui me parait très efficace.

    Je voulais juste rajouter concernant ma méthode que les calculs de projection du cube sur la sphère englobante peuvent être faits une fois pour toutes au départ, en dehors du shader. C'est plus rapide et ca peut intéresser les gens qui ne peuvent pas utiliser les shaders par exemple.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Citation Envoyé par ShevchenKik Voir le message
    C'est plus rapide et ca peut intéresser les gens qui ne peuvent pas utiliser les shaders par exemple.
    Normalement, en 2008 TOUTES les cartes graphiques peuvent faire des shader *

    apres c'est un choix de s interresser ou non aux shaders ... mais au final, le cout d'apprentissage de cette techno est bien vite rembourse par la simplicite par rapport aux machines a etats directX/openGL

    * j'exagere un peu mais pas trop

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

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Normalement, en 2008 TOUTES les cartes graphiques peuvent faire des shader *
    Bien sûr, mais le problème c'est que tout le monde n'a pas encore nécessairement les cartes correspondantes. Pour le développeur 3D ou le joueur, c'est difficile à concevoir, clair. Mais dans mon cas par exemple, où mon application 3D doit tourner chez des opticiens, je ne peux jamais être sûr du hardware présent. Je suis donc obligé de faire une version normale et une version avec shaders de mes programmes....crois-moi je m'en passerai bien,surtout que je m'amuse beaucoup avec les shaders même si ca ne fait que quelques mois que je m'y suis mis.

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Citation Envoyé par ShevchenKik Voir le message
    Bien sûr, mais le problème c'est que tout le monde n'a pas encore nécessairement les cartes correspondantes. Pour le développeur 3D ou le joueur, c'est difficile à concevoir, clair. Mais dans mon cas par exemple, où mon application 3D doit tourner chez des opticiens, je ne peux jamais être sûr du hardware présent. Je suis donc obligé de faire une version normale et une version avec shaders de mes programmes....crois-moi je m'en passerai bien,surtout que je m'amuse beaucoup avec les shaders même si ca ne fait que quelques mois que je m'y suis mis.

    forcement , ...

Discussions similaires

  1. Dessiner une image avec une couleur transparente
    Par FabaCoeur dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 10/02/2008, 20h38
  2. Dessine une ligne avec la souris
    Par MaxAttila dans le forum 2D
    Réponses: 2
    Dernier message: 22/05/2007, 13h35
  3. Rotation d'une sphère avec axes fixes
    Par jmb462 dans le forum OpenGL
    Réponses: 10
    Dernier message: 09/05/2007, 10h44
  4. dessiner une courbe avec OleExcel
    Par blondelle dans le forum C++Builder
    Réponses: 9
    Dernier message: 28/09/2006, 22h05
  5. Dessiner une figure avec graphics.h
    Par Firas_tn dans le forum C
    Réponses: 2
    Dernier message: 29/03/2006, 20h33

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