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 51 52 53 54 55 56 57
|
void HeightMap::CreateDisplayList()
unsigned int k=0,l=0;
double wh = 0.5; // on affiche dans la heightmap sur un plan carré de centre O et de côté 1 (de -0.5 à 0.5 en x et y
double pas = 1./m_size; // m_size vaut 256, c'est le nombre de points de la heightmap
m_displayListHeightMap = glGenLists(1);
glNewList (m_displayListHeightMap, GL_COMPILE);
glColor3f(1.0,1.0,1.0);
glActiveTextureARB(GL_TEXTURE0_ARB); // texture de la heightmap avec ombres précalculées par raytracing
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_finalTex.GetId());
glActiveTextureARB(GL_TEXTURE1_ARB); // texture de détail en niveaux de gris : http://www.web3d-fr.com/tutoriels/modelisation/Textures1/detail.jpg
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_detail.GetId());
glBegin(GL_TRIANGLES);
for(double i = -wh; i < wh-pas ; i+=pas)
{
for(double j = -wh; j < wh-pas ; j+=pas)
{
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+wh,j+wh);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+wh),5.*(j+wh));
glVertex3f(i,j,m_map[k][l]);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+pas+wh,j+wh);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+pas+wh),5.*(j+wh));
glVertex3f(i+pas,j,m_map[k+1][l]);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+wh,j+pas+wh);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+wh),5.*(j+pas+wh));
glVertex3f(i,j+pas,m_map[k][l+1]);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+pas+wh,j+pas+wh);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+pas+wh),5.*(j+pas+wh));glVertex3f(i+pas,j+pas,m_map[k+1][l+1]);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+wh,j+pas+wh);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+wh),5.*(j+pas+wh));
glVertex3f(i,j+pas,m_map[k][l+1]);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+pas+wh,j+wh);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+pas+wh),5.*(j+wh));
glVertex3f(i+pas,j,m_map[k+1][l]);
l++;
}
l=0;
k++;
}
glEnd();
glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_TEXTURE_2D);
glActiveTextureARB(GL_TEXTURE0_ARB);
glDisable(GL_TEXTURE_2D);
glEndList();
} |
Partager