Читайте также: |
|
Для того чтобы проиллюстрировать вызов средств текстурирования, предлагаемых 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").
Дата добавления: 2015-07-10; просмотров: 104 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Функции OpenGL для установки параметров текстуры | | | Истечение жидкости через малое круглое отверстие |