Example 6-3 : Detail Texture Example
unsigned int tex[128][128]; unsigned int detailtex[256][256]; static void make_textures(void) { int i, j; unsigned int *p; /* base texture is solid gray */ p = &tex[0][0]; for (i=0; i<128*128; i++) *p++ = 0x808080ff; /* detail texture is a yellow grid over a gray background */ /* this artificial detail texture is just a simple example */ /* you should derive a real detail texture from the original */ /* image as explained in the text. */ p = &detailtex[0][0]; for (i=0; i<256; i++) { for (j=0; j<256; j++) { if (i%8 == 0 || j%8 == 0) { *p++ = 0xffff00ff; } else { *p++ = 0x808080ff; } } } } static void init(void) { make_textures(); glEnable(GL_TEXTURE_2D); glMatrixMode(GL_PROJECTION); gluPerspective(90.0, 1.0, 0.3, 10.0 ); glMatrixMode(GL_MODELVIEW); glTranslatef(0.,0.,-1.5); glClearColor(0.0, 0.0, 0.0, 1.0); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); /* NOTE: parameters are applied to base texture, not the detail */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_DETAIL_SGIS); glTexParameteri(GL_TEXTURE_2D, GL_DETAIL_TEXTURE_LEVEL_SGIS, -1); glTexImage2D(GL_TEXTURE_2D, 0, 4, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex); glTexImage2D(GL_DETAIL_TEXTURE_2D_SGIS, 0, 4, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, detailtex); } static void draw_scene(void) { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f( 0, 0); glVertex3f(-1,-0.4, 1); glTexCoord2f( 0, 1); glVertex3f(-1,-0.4,-1); glTexCoord2f( 1, 0); glVertex3f( 1,-0.4, 1); glTexCoord2f( 1, 1); glVertex3f( 1,-0.4,-1); glEnd(); glFlush(); }