Каркас Windows-приложения. Особенности нового каркаса. Перемещение в пространстве (с текстурированными стенами), страница 7

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.

Последовательность текстур mipmap