0, GL_RGB, GL_UNSIGNED_BYTE, p->data);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Mipmap Texture Image Exists
int code = gluBuild2DMipmaps (GL_TEXTURE_2D, 3, p->sizeX, p->sizeY,
GL_RGB, GL_UNSIGNED_BYTE, p->data);
if (code != 0)
{
char s[128];
sprintf (s, "\ngluBuild2DMipmaps Error: %s", gluErrorString(code));
MessageBox (0, s, "Error",MB_OK);
return false;
}
if (p->data) // If Texture Image Exists
free(p->data); // Free The Texture Image Memory
free(p); // Free The Image Structure
return true;
}
bool Init ()
{
::GetCurrentDirectory (MAX_PATH-1, curDir);
if (pFile == 0) // If it is the first time (when we create the window)
{
pFile = strcpy (new TCHAR[MAX_PATH], curDir);
pFile = strcat (pFile, "/Data/Crate.bmp");
}
if (!LoadTexture (pFile, &texture))
return false;
glClearColor (0, 0, 0, 0.5f);// Black Background
glShadeModel (GL_SMOOTH); // Enable Smooth Shading
glClearDepth (1); // Depth Buffer Setup
glEnable (GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc (GL_LEQUAL); // The Type Of Depth Testing To Do
glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
return true;
}
void Draw ()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, -5);
glRotatef (angleX, 1, 0, 0);
glRotatef (angleY, 0, 1, 0);
glRotatef (angleZ, 0, 0, 1);
glBindTexture(GL_TEXTURE_2D, texture); // Select the Texture
glBegin(GL_QUADS);
// Front Face
glTexCoord2f (0, 0); glVertex3f (-1, -1, 1); // Bottom Left Of The Texture and Quad
glTexCoord2f (1, 0); glVertex3f ( 1, -1, 1); // Bottom Right
glTexCoord2f (1, 1); glVertex3f ( 1, 1, 1); // Top Right
glTexCoord2f (0, 1); glVertex3f (-1, 1, 1); // Top Left
// Back Face
glTexCoord2f (1, 0); glVertex3f (-1, -1, -1); // Bottom Right
glTexCoord2f (1, 1); glVertex3f (-1, 1, -1); // Top Right
glTexCoord2f (0, 1); glVertex3f ( 1, 1, -1); // Top Left
glTexCoord2f (0, 0); glVertex3f ( 1, -1, -1); // Bottom Left
// 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);
// 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);
// 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);
// 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 += 0.3f; // Rotations
angleY += 0.2f;
angleZ += 0.4f;
}
Введите код в функцию Deinitialize. Эта функция используется впервые.
void Deinitialize () // Performs All Your DeInitialization
{
delete [] pFile;
}
Запустите приложение и проверьте его работу. Обратите внимание на новые моменты.
q В функции перерисовки (Draw) мы вместе с заданием координат вершин задаем координаты текстуры. Последние совмещаются с вершинами куба.
q Функция Init, за исключением строк загрузки текстуры и включения режима отображения двухмерной текстуры, стандартна.
q LoadTexture читает файл, строит последовательность mipmap-изображений и использует изображение нулевого уровня для текстурирования поверхностей куба.
q В коде показано, как пользоваться функцией gluErrorString, которая, опираясь на код ошибки, возвращает ее текстовое описание. Код ошибки возвращает другая функция: glGetError.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.