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 :

glDrawElement et multitexturing


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Par défaut glDrawElement et multitexturing
    Bonjour,

    Voilà, je souhaite utiliser des "détails map" sur mon terrain 3D (très grand)

    Au départ j'ai commencé à utiliser des indices + une texture procédurale (en fonction des hauteurs -style sable/herbe/rocher) le tout colorisé par des teintes +/- grisées en temps réel (système d'ombres).
    Pour afficher, j'utilise donc glDrawElements() en mode triangle strip, ce qui permet de réduire considérablement le tableaux de vertices.
    Sur un terrain assez petit, pas de soucis ...

    J'ai compris comment fonctionnait les "détails map" pas très compliqué dans le fond. Seulement voilà, sans les indices, ça marche, mais si j'essaie de mettre des glDrawElements() avec du multitexturing ben .... Il me compte seulement la dernière texture (Dans le code suivant, c'est la détail map qui est affichée c'est balot hein ??))

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
       glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
     
        // On lie les différentes textures
        // Texture générée procéduralement
        glClientActiveTextureARB(GL_TEXTURE0);
        glEnable( GL_TEXTURE_2D );
        glTexCoordPointer(2,GL_FLOAT,0,&this->maCoords.textures[0]);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glBindTexture( GL_TEXTURE_2D, this->maTexture.handle );
     
        // Détail map
        glClientActiveTextureARB(GL_TEXTURE1);
        glEnable( GL_TEXTURE_2D );
        glTexCoordPointer(2,GL_FLOAT,0,&this->maCoords.gmDetailTextures[0]);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glBindTexture( GL_TEXTURE_2D, this->maDetail.handle );
        glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE);
        glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 2 );
     
        glVertexPointer(3,GL_FLOAT,0,&this->maCoords.vertices[0]);
        glColorPointer(4,GL_FLOAT,0,&this->maCoords.colors[0]);
     
        glEnable(GL_FOG);
     
         // Dessin du terrain par octree
        for(int i=0; i< this->maVisibleTerrainChunks.size(); ++i)
        {
            Chunk& mChunk = this->maVisibleTerrainChunks[i];
            unsigned int numFootedMapChunkAbs = CHUNK_SIZE/(mChunk.chFoot*MAP_FOOT) + 1;
     
            // Dessin des triangles ligne par ligne selon les indices
            for(int numRow =0; numRow < numFootedMapChunkAbs-1; ++numRow)
                glDrawElements(MAP_TYPE,2*numFootedMapChunkAbs, GL_UNSIGNED_INT, &mChunk.getTabIndices()[2*numRow*numFootedMapChunkAbs]);
         }
     
     
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);
     
        glClientActiveTexture(GL_TEXTURE0);
        glDisable( GL_TEXTURE_2D );
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
        glBindTexture(GL_TEXTURE_2D,0);
     
        glClientActiveTexture(GL_TEXTURE1);
        glDisable( GL_TEXTURE_2D );
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
        glBindTexture(GL_TEXTURE_2D,0);
    Un "chunk" c'est une zone de terrain. Je fais un frustrum culling dessus, ce qui permet d'afficher seulement ce que la caméra voit.
    Le code fonctionne très bien, du moins sans le multitexturing.


    Peut-on faire cohabiter glDrawElements() et multitexturing ?
    Dois-je faire les VBO impérativement ? Vu la taille du terrain, elle va être vite bouffée la mémoire de la carte graphique, non ??

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Par défaut
    j'ai trouvé !!

    en fait il faut ajouter le "glActiveTexture(GL_TEXTUREA)" avec A représentant le numéro de texture.
    Je pesnais que dans le cas des Vertex Array, "glClientActiveTexture(GL_TEXTUREA)" remplaçait l'expression précédente, eh bien non, il faut les deux !!

    glClientActiveTexture(GL_TEXTURE0);
    glTexCoordPointer(2,GL_FLOAT,0,BUFFER_OFFSET(0));
    glActiveTexture(GL_TEXTURE0);
    glEnable( GL_TEXTURE_2D );
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glBindTexture( GL_TEXTURE_2D, this->maTexture.handle );
    Exemple avec des vBO + multitexturing (qui fonctionne).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Multitexturing Vertex Array et Display List
    Par Wyatt dans le forum OpenGL
    Réponses: 1
    Dernier message: 04/05/2005, 15h07
  2. Multitexturing?
    Par Wyatt dans le forum OpenGL
    Réponses: 1
    Dernier message: 16/02/2005, 14h16
  3. pb de multitexturing
    Par SaKi dans le forum OpenGL
    Réponses: 5
    Dernier message: 16/02/2005, 13h13
  4. Multitexturing et éclairage
    Par Dranor dans le forum DirectX
    Réponses: 5
    Dernier message: 21/02/2004, 12h41
  5. Multitexturing???
    Par sebh dans le forum OpenGL
    Réponses: 2
    Dernier message: 07/12/2003, 18h23

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