Chapter 7
Инициализация или как написать приложение с нуля

7.7  Библиотека 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, выполните следующие действия:
  1. Cоздайте новый проект - "Консольное приложение Win32"
  2. В меню Build->Set Active Configuration выберите Release
  3. Далее, Project->Settings->Link->Objetc/library modules: впишите следующие библиотеки opengl32.lib glu32.lib glut32.lib.
  4. Скопируйте мой шаблон 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();
}