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, выполните
следующие действия:
- 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
// здесь не нужен больше модификатор 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 );
}
{
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
*/
}
|