Пример программы с применением текстурирования

Для того чтобы проиллюстрировать вызов средств текстурирования, предлагаемых OpenGL, приведено приложение, которое отображает вращающийся тетраэдр. На рис. 11.10 показан один кадр анимации, создаваемой этой программой. Код данного приложения приведен далее в листинге 11.1.

Листинг 11.1. Приложение, осуществляющее вращение текстурированного тетраэдра:

#include <gl\glut.h>

#include <gl\glaux.h>

#pragma comment(lib, "glaux.lib")

GLfloat ratio = 4.0/3.0;

GLfloat angle = 0.0;

void init()

{ glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(60.0, ratio, 0.01f, 110.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt(0.0, 2.0, -2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

AUX_RGBImageRec *image = auxDIBImageLoad("image.bmp");

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->sizeX, image->sizeY, 0, 3, GL_UNSIGNED_BYTE, image->data);

glEnable(GL_TEXTURE_2D);

glEnable(GL_DEPTH_TEST);

}

void reshape(int width, int height)

{ if (ratio > width/height) glViewport(0, 0, width, width/ratio);

 else glViewport(0, 0, height*ratio, height);

}

void display()

{ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glPushMatrix();

       glRotatef(angle, 0.0, 1.0, 0.0);

       glBegin(GL_TRIANGLES);

                // грань 0

                glTexCoord2f(0, 0); glVertex3f(1, 0, 0);

                glTexCoord2f(0, 1); glVertex3f(0, 1, 0);

                glTexCoord2f(1, 0); glVertex3f(0, 0, 1);

                // грань 1

                glTexCoord2f(0, 0); glVertex3f(0, 0, 0);

                glTexCoord2f(0, 1); glVertex3f(0, 1, 0);

                glTexCoord2f(1, 0); glVertex3f(1, 0, 0);

                // грань 2

                glTexCoord2f(0, 0); glVertex3f(0, 0, 0);

                glTexCoord2f(1, 0); glVertex3f(0, 0, 1);

                glTexCoord2f(0, 1); glVertex3f(0, 1, 0);

                // грань 3

                glTexCoord2f(0, 0); glVertex3f(1, 0, 0);

                glTexCoord2f(0, 1); glVertex3f(0, 0, 1);

                glTexCoord2f(1, 0); glVertex3f(0, 0, 0);

       glEnd();

 glPopMatrix();

 glFlush();

 glutSwapBuffers();

}

void idle()

{ angle += 0.5f;

 if (angle > 360.0) angle = 0.0;

 glutPostRedisplay();

}

int main(int argc, char* argv[])

{ glutInit(&argc, argv);

 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

 glutInitWindowPosition(0, 0);

 glutInitWindowSize(640, 480);

 glutCreateWindow("Пример текстурирования");

 glutDisplayFunc(display);

 glutReshapeFunc(reshape);

 glutIdleFunc(idle);

 init();

 glutMainLoop();

 return 0;

}

 

В данном примере для загрузки в оперативную память изображения “image.bmp” используется функция библиотеки GLAux (OpenGL Auxiliary Library), прототип которой:

AUX_RGBImageRec * APIENTRY auxRGBImageLoad(LPCTSTR).

Функция возвращает указатель на структуру AUX_RGBImageRec, где sizeX – ширина и sizeY – высота изображения, а data – указатель на загруженные в память данные изображения.

GLUT автоматически подключает библиотеки OpenGL32.lib, GLUT32.lib и другие, при подключении

#include <gl\glut.h>.

В отличие от библиотеки GLUT библиотеке GLAux, кроме подключения #include <gl\glaux.h>, необходимо также подключение библиотеки GLAux.lib, что можно сделать следующим образом:

#pragma comment(lib, "glaux.lib").


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: