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 ??