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 :

utilisation texture3D ?


Sujet :

OpenGL

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Par défaut utilisation texture3D ?
    Bonjour,

    Depuis quelques jours j'essaie d'utiliser une texture 3D avec JOGL pour afficher un volume (le but étant de faire du direct volume rendering ) mais je ne comprend pas bien le fonctionnement des texture3D.
    est ce qu'il faut créer plusieurs textures 3D et les aligner pour en faire un volume (comme pour les textures 2D), ou bien il y a une autre manière de précéder avec une seule texture 3D ?

    merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Salut,

    une texture 3D a, comme son nom l'indique, 3 dimensions :
    nombres de pixels de large * nombre de pixels de haut * nombre de couches
    Tu peux voir ca comme un pile de texture 2D.
    Du coup les coordonnées de texture sont définie par 3 valeurs au lieu de 2.
    (par exemple en mode immédiat ca prendra du glTexCoord3f au lieu du classique glTextCoord2f)

    Chaque dimension est définie dans le repère [0,1].
    Ca fonctionne exactement comme une texture 2D a une dimension pres.

    L interet étant que tu peux faire de l'interpolation lineaire entre 2 couches adjacentes (si tu n'es pas en NEAREST) et donc faire des transitions smooth entre 2 couches.

    Qu est ce que tu ne comprends pas exactement ?
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Par défaut
    bonjour,
    désolé pour la réponse tardive . en fait j'avais compris le fait que je peux considérer une texture 3D comme une pile de textures 2D. Ce que veux savoir c si je peux afficher toutes les slice de la texture 3D en même temps ? étant donné que toutes ces slices sont contenues dans un seul buffer. J'ai essayer de faire varier la coordonnée z dans glTexCoord3f() mais ça ne m'affichait pas de volume. J'ai donc essayer de faire varier cette même coordonnée dans glTexCoord3f() et glVertex3f(), la slice bouge, mais c'est toujours la même
    voila la fonction que j'utilise pour l'affichage:
    tex3D2 est un objet de type Texture3D que j'ai créer et qui contient différente information relative a la texture ( dimensions, ID , un byteBuffer contenant toutes les slices qui représentent le volume )
    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
    22
    23
     
       int zPixelStep = 0 ; // coordonnée z 
     
       private void displayTex3D2(GL gl) {
          zPixelStep +=1; 
          zPixelStep = (zPixelStep ==tex3D2.getDepth())? 0 : zPixelStep ; // test pour que la valeur de zPixelStep ne dépasse pas le nombre de slices.
     
          gl.glEnable(GL.GL_TEXTURE_3D);
          gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
          gl.glBindTexture(GL.GL_TEXTURE_3D, tex3D2.getID());
     
          gl.glBegin(GL.GL_QUADS); // chaque texture est une rectangle
     
          gl.glTexCoord3f(0, 0, zPixelStep);gl.glVertex3f(0, 0, zPixelStep);
    // je vais varier la coordonnée z pour les texture et leurs vertex associés
          gl.glTexCoord3f(0, 1.0f, zPixelStep);gl.glVertex3f(0, height,zPixelStep);
          gl.glTexCoord3f(1.0f, 1.0f, zPixelStep); gl.glVertex3f(width, height, zPixelStep);
          gl.glTexCoord3f(1.0f, 0, zPixelStep);  gl.glVertex3f(width, 0,zPixelStep);
     
          gl.glEnd();
          gl.glDisable(GL.GL_TEXTURE_3D);
     
       }

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Ce n'est pas aussi simple que cela... Si tu veux faire du rendu volumique il ne suffit pas d'afficher un simple quad pour voir ton volume (sinon tu verras toujours qu'une slice de ton volume comme tu as pu le remarquer...) voire meme d'afficher un cube car OpenGL le transforme en triangles...

    Ce qu'il faut que tu fasses est une integration de ton volume (au sens mathematique du terme) le long de la direction de vue de la camera. Si ta camera regarde dans la direction des z, il va falloir que tu dessines plusieurs rectangles eloignes d'une certaine distance et orientes selon l'axe des z (ou l'axe de vue de ta camera si ce n'est pas z). Ainsi ces rectangles vont te permettre de pouvoir acceder a differentes slices de ton volume. Il ne te reste ensuite qu'a additionner toutes ces slices (en activant le blending d'OpenGL) pour integrer ton volume et le voir en "3D". N'oublie pas qu'il te faut etre en mode de projection orthogonal et non perspective. Il existe d'autres methodes plus complexes qui utilisent ensuite des shaders et qui permettent de faire du rendu en perspective par exemple. Je ne connais pas vraiment de tutoriel ensuite sur le net qui expliquent tout ca simplement... Apres tu as toujours des articles scientifiques mais bon accroche-toi xD

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Par défaut
    bonsoir Tanek,

    Citation Envoyé par TanEk Voir le message
    Si ta camera regarde dans la direction des z, il va falloir que tu dessines plusieurs rectangles eloignes d'une certaine distance et orientes selon l'axe des z
    si j'ai bien compris ce n'est pas la peine de faire de texture 3D pour faire du rendu volumique ? et puis je ne peux pas utiliser le mode de projection orthogonal par ce que je voudrais que le volume puisse bouger, alors je pense que je vais apprendre a utiliser les shaders. Mais je vais quand même essayer l'intégration du volume comme vous me l'avez expliqué. merci pour votre aide.

  6. #6
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Non la camera en projection orthogonale permet de faire de la 3d, c'est juste le type de projection qui change... tu peux faire la technique que je t'ai donne en perspective mais tu verras des choses bizarres apparaitre . Dans tous les cas il te faut une texture 3d... C'est juste que tu accedes a la texture au moyen de plans 2d que tu vas fusionner ensemble pour donner l'effet 3d (imagines que tu coupes ton volume en petite partie et ensuite tu applaties (en additionnant) toutes ces parties sur l'ecran... C'est ce que fait le blending. Sinon si tu n'as pas peur de l'anglais, un bon depart je pense :

    http://www.daimi.au.dk/~trier/?page_id=98

    Apres je n'ai personnellement jamais implemente de rendu volumique donc je ne peux pas te donner toutes les ficelles, juste les grandes lignes

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Par défaut
    Merci pour le lien. (l'anglais ne me fais pas trop peur :-p)
    ce que je ne comprend pas c'est comment accéder au différents plans de ma texture 3D. Je pensais que ça se ferait avec glTextCoord3f() et que en modifiant le dernier paramètre j'aurai accès aux différents plan, mais apparemment ça ne marche pas (en tout cas pour moi ça ne marche pas). Il y a un autre moyen pour ça ?

    J'ai quand même réussi a obtenir un volume en utilisant des textures 2D, mais je fais trois grosses boucles pour chaque axe (X,Y et Z) et je ne pense pas que ça soit une bonne idée pour la performance de mon programme ...

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Bah normalement c'est censé marcher avec glTexCoord3f (enfin ca marche puisque je l'ai déjà fait). N'oublie pas que c'est mappé sur [0,1] en gros 0.0f mappe sur la première couche et 1.0f sur la dernière, entre les 2 c'est de l'interpolation linéaire. Peut être faut il aussi que le nombre de couches soit un multiple de 2 mais ca je n'en suis pas sur.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2009
    Messages : 9
    Par défaut
    Citation Envoyé par Frifron Voir le message
    N'oublie pas que c'est mappé sur [0,1] en gros 0.0f mappe sur la première couche et 1.0f sur la dernière, entre les 2 c'est de l'interpolation linéaire..
    bonjour Frifron,
    Je ne savais pas ce que voulais dire "mappé sur [0,1] " , mais maintenant j'ai compris et j'arrive a accéder a chaque plan de ma texture3D ^^ , merci beaucoup. Et oui effectivement il faut que les dimensions soient une puissance de 2 ( je ne sais pas pourquoi d'ailleurs), mais j'ai déjà réglé ce problème . Maintenant je vais essayer l'intégration du volume ( et aussi les shaders par ce que ça à l'air génial ^^). Encore merci, je vous tiendrai au courant au cas ou quelqu'un d'autre voudra faire la même chose.

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 16h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 15h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 13h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 17h01
  5. Réponses: 2
    Dernier message: 21/03/2002, 00h01

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