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 :

Objet en GL_TRIANGLES et placage de texture


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 208
    Par défaut [Résolu] Objet en GL_TRIANGLES et placage de texture
    Bonjour bonjour,

    Voila, je suis en train de réaliser un loader de .obj pour une application en OpenGL ES.
    Aucun problème pour afficher l'objet, mais ça part en vrille lors du placage de ma texture.

    Pour illustrer mon problème, on va prendre l'exemple d'un plan :
    Je le construis à l'aide de deux triangles.



    Si le plan est formé des sommets ABCD, je passe à OpenGL les indices suivants : 0/1/2 3/2/1.
    (Soit les triangles ABC et DCB)

    Mon plan s'affiche correctement.

    Passons aux coordonnées de textures.
    Je passe à OpenGL une texture 2D, via un floatbuffer contenant les coordonnées de textures suivantes :
    0,1 / 0,0 / 1,1 / 1,0 / 1,1 / 0,0.

    Dans ce sens, le placage marche très bien.



    Mais pour un autre plan d'indices : 0/1/2 2/3/0
    (Soit les triangles ABC et CDA)
    Et avec les coordonnées de textures correspondantes :
    0,0 / 1,0 / 1,1 / 1,1 / 0,1 / 0,0

    Le placage par en vrille.
    On dirait qu'OpenGL n'utilise que les 4 coordonnées, à savoir une par sommet (comme s'il dessinait mon plan en GL_QUADS, pour les textures).

    J'ai déjà vérifié le contenu des buffers que je passe à OpenGL (pour les coordonnées de textures, de vertex et les indices pour créer mes faces) à coup de débug, c'est correcte.

    Ci-après comment j'affiche mon plan plein :

    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
     
    gl.glFrontFace(GL10.GL_CCW);
     
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer);
     
    gl.glEnable(GL10.GL_TEXTURE_2D);
     
    gl.glActiveTexture(GL10.GL_TEXTURE0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexturePick);
     
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
                    GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
                    GL10.GL_CLAMP_TO_EDGE);
     
     
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mFTextVertexBufferPick);
     
    gl.glDrawElements(GL10.GL_TRIANGLES, NbFacesIndices, GL10.GL_UNSIGNED_BYTE, mIndexBufferFaces);
     
    gl.glDisable(GL10.GL_TEXTURE_2D);
    Pour tous les mesh que je load, l'affichage à l'écran est correcte, même les plus compliqués.
    J'en conclus donc que mes indices (mIndexBufferFaces) passés à glDrawElements sont bon.
    Seul le placage de texture ne fonctionne pas.

    Pour chaque triangle que je dessine, je dois bien donner 3 coordonnées de textures?

    Merci d'avance pour vos réponses

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 41
    Par défaut
    Il me semble que 2 coordonnées de texture suffisent !
    En effet on spécifie en envoyant les tableaux le nombre de données utilisées, à savoir ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mFTextVertexBufferPick);
    Le 2

    Je pense que c'est la dont viens le problème

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 208
    Par défaut
    Yop !

    Deux coordonnées?
    Mais c'est étranges...

    Quelles sont les coordonnées à envoyer alors?

    Dans la logique de la chose pour ma petite tête, je voyais ça comme ça :

    Pour chaque point de ma face, je donne le couple de coordonnées (X,Y) correspondant.

    Point A : (0,0)
    Point B : (1,0)
    Point C : (1,1)

    Et effectivement, pour chaque premier triangle ça fonctionne.

    Mais pas pour le second.

    Point C : (1,1)
    Point D : (0,1)
    Point A : (0,0)

    Bref, je suis perdu =D

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 208
    Par défaut
    C'est encore moi =D

    A noter qu'il semblerait que j'ai le même problème avec les normales.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl.glNormalPointer(GL10.GL_FLOAT, 0, mFNormalesBufferPick);
    mFNormalesBufferPick contient (NbFacesIndices * 3) float.

    Une face étant définie par 3 indices, j'ai donc 9coordonnées (3 (X,Y,Z)) de normales par face.
    Une normale par sommet.

    Je pars du principe qu'OpenGL utilise le contenu de mon Buffer de coordonnées de texture et mon buffer de normales avec le même buffer d'indice que celui pour dessiner mes faces :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl.glDrawElements(GL10.GL_TRIANGLES, NbFacesIndices, GL10.GL_UNSIGNED_BYTE, mIndexBufferFaces);
    Est ce correcte?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 208
    Par défaut
    Problème résolu ici aussi !

    Il suffisait de dupliquer les vertex ayant plusieurs normales différentes (merci Bul), de créer un nouveau buffer d'indices en fonctions de ce tableau de sommets, et de recréer un tableau de normales ainsi qu'un tableau de texture en

    fonction de ce nouveau tableau d'indices.

    Exemple pour deux plans perpendiculaires, ayant les vertex B et D en commun :

    Tableau de vertex initial

    A B C D E F
    Tableau d'indice de face initial

    A B C C D A E F A A D E
    Tableau d'indice de normales initial

    V V V V V V W W W W W W
    On remarque tout de suite que le Vertex A possede une normale V pour une face, et une normale W pour une autre face
    Même chose pour le Vertex D

    Nous allons donc créer un nouveau tableau de vertex, qui contiendra 2 vertex de plus

    Nouveau tableau de vertex

    A B C D E F G H >>>>Dont les coordonées seront celles des vertex>>>> A A B C D D E F
    Nouveau tableau d'indices de face

    A C D D E A G H B B F G
    Il ne faut bien sur pas oublier de créer un nouveau tableau de coordonnées de normales et de texture, ayant le même nombre de case (*3 pour les coordonnées de sommets et *2 pour les coordonnées de texture (TEXTURE_2D)) que votre nouveau

    tableau de vertex, et le trier dans le même ordre que votre nouveau tableau d'indice.
    Dès lors, tout devrait fonctionner à merveille dans votre fonction d'affichage.

    Attention aussi au chargement de votre texture (fichier bitmap, jpg...), il est possible qu'elle soit lu de Haut/Gauche vers Bas/Droite, inversant de ce fait toutes vos coordonnées sur l'axe V.



    A noter qu'il y a des problèmes à l'affichage, mais dues à la création de ma fenêtre ou de ma projection (je pense), les axes sont inversés.
    Mais je posterais dans un nouveau sujet (si je n'ai pas trouvé d'où vient mon erreur).


    Edit : Bouh qu'il est bête, l'inversion des axes vient de mon modèle, en effet, pour mon logiciel 3D, l'axe "haut" est l'axe Z et non pas Y comme spécifié dans mon programme OpenGL.

Discussions similaires

  1. [opengl] probleme d artefact au placage des textures
    Par ubenz dans le forum Moteurs 3D
    Réponses: 0
    Dernier message: 07/11/2008, 12h23
  2. placage de textures
    Par xelif dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 17/04/2008, 22h17
  3. Réponses: 5
    Dernier message: 18/12/2006, 17h02
  4. Placage de texture
    Par Teapot dans le forum OpenGL
    Réponses: 22
    Dernier message: 10/09/2006, 13h41
  5. prob de placage de texture en 2d
    Par lordheavy dans le forum OpenGL
    Réponses: 3
    Dernier message: 15/08/2006, 23h03

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