glTexImage2D (GL_TEXTURE_2D, 0, 3, p->sizeX, p->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, p->data);
glBindTexture (GL_TEXTURE_2D, pTexture[2]); // Create MipMapped Texture
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps (GL_TEXTURE_2D, 3, p->sizeX, p->sizeY,
GL_RGB, GL_UNSIGNED_BYTE, p->data);
if (p->data)
free(p->data);
free(p);
return true;
}
bool Init ()
{
::GetCurrentDirectory (MAX_PATH-1, curDir);
if (pFile == 0)
{
pFile = strcpy (new TCHAR[MAX_PATH], curDir);
pFile = gInfo.bFull ? strcat (pFile, "/Data/Fly.bmp") : FileDlg (true);
}
if (!LoadTexture (pFile, texture))
return false;
glClearColor (0, 0, 0, 0.5f);// Black Background
glShadeModel (GL_SMOOTH); // Enable Smooth Shading
glEnable (GL_DEPTH_TEST); // Enables Depth Testing
glClearDepth (1); // Depth Buffer Setup
glDepthFunc (GL_LEQUAL); // The Type Of Depth Testing To Do
glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable (GL_LIGHT0);
glLightfv (GL_LIGHT0, GL_AMBIENT, ambient); // Setup The Ambient Light
glLightfv (GL_LIGHT0, GL_DIFFUSE, diffuse); // Setup The Diffuse Light
glLightfv (GL_LIGHT0, GL_POSITION,position); // Position The Light
glEnable (GL_TEXTURE_2D); // Enable Texture Mapping
return true;
}
Изменения в функции Draw связаны с тем, что мы включили свет — теперь надо учитывать нормали.
void Draw ()
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity();
glTranslatef (0, 0, z); // Move Into The Screen 5 Units
glRotatef (angleX, 1, 0, 0);
glRotatef (angleY, 0, 1, 0);
glBindTexture (GL_TEXTURE_2D, texture[filter]);
glBegin (GL_QUADS);
glNormal3f (0, 0, 1); // Front Face
glTexCoord2f (0, 0); glVertex3f (-1, -1, 1);
glTexCoord2f (1, 0); glVertex3f ( 1, -1, 1);
glTexCoord2f (1, 1); glVertex3f ( 1, 1, 1);
glTexCoord2f (0, 1); glVertex3f (-1, 1, 1);
glNormal3f ( 0, 0,-1); // Back Face
glTexCoord2f (1, 0); glVertex3f (-1, -1, -1);
glTexCoord2f (1, 1); glVertex3f (-1, 1, -1);
glTexCoord2f (0, 1); glVertex3f ( 1, 1, -1);
glTexCoord2f (0, 0); glVertex3f ( 1, -1, -1);
glNormal3f ( 0, 1, 0); // Top Face
glTexCoord2f (0, 1); glVertex3f (-1, 1, -1);
glTexCoord2f (0, 0); glVertex3f (-1, 1, 1);
glTexCoord2f (1, 0); glVertex3f ( 1, 1, 1);
glTexCoord2f (1, 1); glVertex3f ( 1, 1, -1);
glNormal3f ( 0,-1, 0); // Bottom Face
glTexCoord2f (1, 1); glVertex3f (-1, -1, -1);
glTexCoord2f (0, 1); glVertex3f ( 1, -1, -1);
glTexCoord2f (0, 0); glVertex3f ( 1, -1, 1);
glTexCoord2f (1, 0); glVertex3f (-1, -1, 1);
glNormal3f ( 1, 0, 0); // Right face
glTexCoord2f (1, 0); glVertex3f ( 1, -1, -1);
glTexCoord2f (1, 1); glVertex3f ( 1, 1, -1);
glTexCoord2f (0, 1); glVertex3f ( 1, 1, 1);
glTexCoord2f (0, 0); glVertex3f ( 1, -1, 1);
glNormal3f (-1, 0, 0); // Left Face
glTexCoord2f (0, 0); glVertex3f (-1, -1, -1);
glTexCoord2f (1, 0); glVertex3f (-1, -1, 1);
glTexCoord2f (1, 1); glVertex3f (-1, 1, 1);
glTexCoord2f (0, 1); glVertex3f (-1, 1, -1);
glEnd();
angleX += xspeed; angleY += yspeed;
}
Изменения в Update связаны с введением управлений: клавиша F изменяет способ фильтрации, клавиша L включает и выключает свет, а клавиши управления курсором влияют на скорость вращения.
void Update (DWORD ms)
{
if (gInfo.keys[VK_ESCAPE])
{
gInfo.bQuit = true;
PostMessage (gInfo.hWnd, WM_QUIT, 0, 0);
}
if (gInfo.keys[VK_F1])
PostMessage (gInfo.hWnd, WM_TOGGLEFULLSCREEN, 0, 0);
if (gInfo.keys['L'] && !lp)
{
lp = true;
light = !light;
if (!light)
glDisable(GL_LIGHTING);
else
glEnable(GL_LIGHTING);
return;
}
if (!gInfo.keys['L'])
lp = false;
if (gInfo.keys['F'] && !fp)
{
fp = true;
filter = (filter + 1) % 3;
gInfo.title =
filter == 0 ? "Nearest Filtered Texture" :
filter == 1 ? "Linear Filtered Texture" :
"MipMapped Filtered Texture";
SetWindowText (gInfo.hWnd, gInfo.title);
return;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.