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 :cry: c'est balot hein ??))
Code:
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 ??