Библиотека GLUT
Так получилось, что все примеры к этой книги я написал с использованием библиотеки GLAUX. Библиотека GLUT не менее, а может даже и более универсальная, чем GLAUX. Ее реализация доступна в исходных кодах на языке Си, и она собирается под самые различные платформы и реализации OpenGL. При написание программ для Windows недостатком является отсутствие библиотеки glut32.dll в стандартной поставке Windows. В следствие чего вам придется вместе со своей программой распространять еще и файл glut32.dll, который занимает около 150Кб. В то время как, с библиотекой GLAUX такой необходимости нет, ваш исполняемы файл будет работать на любой машине, где установлена операционная система Windows. Отмечу еще, что GLUT предоставляет больше возможностей по взаимодействия с операционной системой. Вы, например, можете создавать меню. Но в библиотеки GLUT нет таких функций, как [Solid/Wire]Box, [Solid/Wire]Cylinder. Правильные многогранники рисуются одного размера. Стоит еще заметить, что в ней нет ошибки Microsoft, когда у нас не получалось нарисовать на экране два конуса так, чтобы один из них был проволочный, а другой сплошной. Среди прилагающихся программ вы найдете приложение shapes_glut. Сравните с рисунком из упражнения "Рисуем трехмерные объекты".
Исходный файл смотрите . Исполняемый файл .
Я вам, вкратце, обрисовал все ЗА и ПРОТИВ, а вы уже сами решайте, что вам использовать в каждом конкретном случае. Для того чтобы создать приложение c использованием библиотеки GLUT выполните следующие действия:
- Cоздайте новый проект - "Консольное приложение Win32"
- В меню Build->Set Active Configuration выберите Release
- Далее Project->Settings->Link->Objetc/library modules: впишите следующие библиотеки opengl32.lib glu32.lib glut32.lib.
- Скопируйте мой шаблон glut.c и подключите его Project->Add To Project->Files
Далее я привожу исходный текст шаблонного файла glut.c с комментариями. Места выделенные серым цветом отличаются от того, что было в glaux.c, все остальное тоже самое.
/* * (c) Copyright 1995-2000, Igor Tarasov * FidoNet: 2:5020/370.2 620.20 1103.5 * email: igor@itsoft.miem.edu.ru itarasov@rtuis.miem.edu.ru * Phone: (095)916-89-51 916-89-63 */ #include <windows.h> #include <GL/gl.h> #include <GL/glu.h> // подключаем заголовочный файл glut.h #include <GL/glut.h> // здесь не нужен больше модификатор CALLBACK void resize(int width,int height) { glViewport(0,0,width,height); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho(-5,5, -5,5, 2,12); gluLookAt( 0,0,5, 0,0,0, 0,1,0 ); glMatrixMode( GL_MODELVIEW ); } void display(void) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); /* remove next tree lines * and enter your code here */ glTranslated(0.01,0,0); glColor3d(1,0,0); //изменились префиксы функций // и появились некоторые дополнительные параметры, // которые позволяют лучше контролировать // выполнение того или иного действия // в данном случае 15, 15 означает кол-во разбиений // вдоль оси Z и поперек, т.е. дискретность с которой будет рисоваться // сфера, чем выше эти параметры, тем более качественно будет сделана сфера, // но на это уйдет и больше времени glutSolidSphere(1, 15,15); glutSwapBuffers(); } void main() { float pos[4] = {3,3,3,1}; float dir[3] = {-1,-1,-1}; GLfloat mat_specular[] = {1,1,1,1}; // тут только префиксы поменялись // назначения функций можете посмотреть в // разделе по библиотеке GLAUX glutInitWindowPosition(50, 10); glutInitWindowSize(400, 400); glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE ); glutCreateWindow( "GLUT Template" ); glutIdleFunc(display); glutDisplayFunc(display); glutReshapeFunc(resize); glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialf(GL_FRONT, GL_SHININESS, 128.0); /* * Enter your cod here */ glutMainLoop(); }