- •Часть II. Основы программирования
- •Введение
- •Лекция 1. Библиотека OpenGl
- •1. Назначение библиотеки OpenGl
- •2. Основные возможности OpenGl
- •3. Макет консольного приложения, использующего библиотеку glaux
- •Программа 1.1
- •4. Имена функций OpenGl
- •5. Системы координат
- •5.1 Матрицы преобразований
- •5.2 Видовые и модельные преобразования
- •5.3 Проекционное преобразование
- •5.4 Оконное преобразование
- •6. Пример выполнения модельных преобразований
- •6.1 Параллельный перенос
- •Фрагмент программы 1.2
- •6.2 Поворот
- •Фрагмент программы 1.3
- •7. Сводка результатов
- •8. Упражнения Упражнение 1
- •Упражнение 2
- •Упражнение 3
- •Упражнение 4
- •Упражнение 5
- •Упражнение 6
- •Лекция 2. Генерация движущихся изображений
- •1. Анимация с двойной буферизацией
- •2. Обработка событий клавиатуры и мыши
- •2.1 Пример обработки события от мыши: изменение цвета вращающегося объекта по нажатию левой кнопки мыши
- •3. Композиция нескольких преобразований
- •3.1 Модель солнечной системы
- •3.2 Модель манипулятора робота
- •4. Сводка результатов
- •5. Упражнения Упражнение 1
- •Упражнение 2
- •Упражнение 3
- •Упражнение 4
- •Упражнение 5
- •Лекция 3. Геометрические примитивы
- •1. Служебные графические операции
- •1.1 Очистка окна
- •1.2 Задание цвета
- •1.3 Удаление невидимых поверхностей
- •2. Описание точек, отрезков и многоугольников
- •2.1 Точки
- •2.2 Отрезки
- •2.3 Многоугольники
- •2.4 Прямоугольники
- •2.5 Кривые
- •2.6 Задание вершин
- •2.7 Геометрические примитивы OpenGl
- •3. Свойства точек, отрезков и многоугольников
- •3.1 Точки
- •3.2 Отрезки
- •3.3 Многоугольники
- •4. Сводка результатов
- •Лекция 4. Полигональная аппроксимация поверхностей
- •1. Векторы нормали
- •2. Некоторые рекомендации по построению полигональных аппроксимаций поверхностей
- •3. Пример: построение икосаэдра
- •3.1 Вычисление нормалей к граням икосаэдра
- •3.2 Повышение точности аппроксимации сферической поверхности
- •3.3 Алгоритм разбиения треугольной грани произвольной поверхности
- •4. Плоскости отсечения
- •6. Сводка результатов
- •7. Упражнения Упражнение 1
- •Упражнение 2
- •Упражнение 3
- •Упражнение 4
- •Лекция 5. Цвет и освещение
- •1. Цветовая модель rgb
- •2. Задание способа закраски
- •3. Освещение
- •4. Освещение в реальном мире и в OpenGl
- •4.1 Излучаемый, рассеянный, диффузно отраженный и зеркально отраженный свет
- •4.2 Цвет материала
- •4.3 Значения rgb для источников света и материалов
- •5. Пример: рисование освещенной сферы
- •5.1 Вектора нормали в вершинах объектов
- •5.2 Создание, расположение и включение источников света
- •5.3 Выбор модели освещения
- •5.4 Задание свойств материалов для объектов сцены
- •6. Создание источников света
- •6.1 Цвет
- •6.2 Местоположение и затухание
- •6.3 Прожекторы
- •6.4 Использование нескольких источников света
- •6.5 Изменение местоположения источников света
- •4. Сводка результатов
- •Лекция 6. Свойства материала и спецэффекты освещения
- •1. Задание свойств материала
- •1.1 Диффузное и рассеянное отражение
- •1.2 Зеркальное отражение
- •1.3 Излучаемый свет
- •1.4 Изменение свойств материала
- •1.5 Имитация реальных материалов
- •2. Смешение цветов и прозрачность
- •2.1 Множители source (исходный пиксел) и destination (результирующего пиксела)
- •2.3 Пример использования смешения цветов
- •2.2 Области применения смешения цветов
- •3. Туман
- •3.1 Использование тумана
- •4. Сводка результатов
- •5. Упражнения Упражнение 1
- •2. Назначение текстур
- •3. Создание текстуры в оперативной памяти
- •4. Автоматическое повторение текстуры на плоском многоугольнике
- •5. Наложение текстуры на произвольную поверхность
- •6. Сводка результатов
- •7. Упражнения Упражнение 1
- •Упражнение 2
- •Задание 1.1
- •2. Объемный "тетрис"
- •Задание 2.1
3. Туман
Компьютерные изображения иногда выглядят нереально резкими и качественными. Резкость краев объектов уменьшается с помощью сглаживания. Еще одно средство для создания реалистичных изображений – добавление "тумана", который делает объекты менее четкими по мере увеличения расстояния от наблюдателя. Термином "туман" (fog) в OpenGL обозначается целая группа атмосферных эффектов, таких, как дымка, пасмурность, копоть и т.п. Например, туман часто используется в авиационных симуляторах.
При включенном тумане цвет более далеких объектов постепенно переходит в цвет тумана. OpenGL позволяет задать цвет и плотность тумана (она определяет скорость, с которой образы объектов расплываются с расстоянием). Расчет тумана уменьшает скорость работы программы.
3.1 Использование тумана
Для использования тумана сначала надо включить его, а затем настроить свойства. Включение выполняется вызовом glEnable(GL_FOG), а определение свойств –вызовами функции glFog*():
void glFog{if}{v}(GLenum pname, TYPE param);
Она позволяет выбрать цвет, плотность (density) и уравнение для расчета множителя тумана f, на который будет умножается цвет в цветовом буфере. Есть три возможных уравнения:
GL_EXP:
GL_EXP2:
GL_LINEAR:
У функции glFog*() параметр pname выбирает изменяемое свойство – GL_FOG_MODE (уравнение для расчета множителя), GL_FOG_COLOR (цвет), GL_FOG_DENSITY (плотность), GL_FOG_START (дальность начала тумана) или GL_FOG_END (дальность завершения тумана). Для свойства GL_FOG_MODE допустимы перечисленные выше значения GL_EXP (по умолчанию), GL_EXP2 или GL_LINEAR. Значения по умолчанию других параметров: density=1, start=0, end=1.
Применение тумана показано в программе 6.4. Она рисует пять желтых чайников (из полированного золота), расположенных на разном расстоянии от наблюдателя. По нажатию левой кнопки мыши программа меняет уравнение для расчета множителя тумана.
#include <iostream.h>
#include <windows.h>
#include <math.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
GLint fogMode;
void CALLBACK cycle_fog( AUX_EVENTREC* )
{
if ( fogMode == GL_EXP ) {
fogMode = GL_EXP2;
cout << "Fog mode is GL_EXP2\n";
}
else if ( fogMode == GL_EXP2 ) {
fogMode = GL_LINEAR;
cout << "Fog mode is GL_LINEAR\n";
glFogf( GL_FOG_START, 1.0 );
glFogf( GL_FOG_END, 5.0 );
}
else if ( fogMode == GL_LINEAR )
{
fogMode = GL_EXP;
cout << "Fog mode is GL_EXP\n";
}
cout.flush();
glFogi( GL_FOG_MODE, fogMode );
}
void light_init()
{
float pos[] = { 0.0, 0.0, 1.0, 0.0 };
glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );
glLightfv( GL_LIGHT0, GL_POSITION, pos );
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable( GL_FOG );
float fogColor[4] = { 0.5, 0.5, 0.5, 1.0 };
fogMode = GL_EXP;
glFogi( GL_FOG_MODE, fogMode );
glFogfv( GL_FOG_COLOR, fogColor );
glFogf( GL_FOG_DENSITY, 0.35f );
glClearColor( 0.5, 0.5, 0.5, 1.0 );
}
void draw_red_teapot( float x, float y, float z )
{
float gold_amb[4] = { 0.25f, 0.22f, 0.06f, 1.00 };
float gold_diff[4] = { 0.35f, 0.31f, 0.09f, 1.00 };
float gold_spec[4] = { 0.80f, 0.72f, 0.21f, 1.00 };
float gold_shin = 83.2f;
glMaterialfv( GL_FRONT, GL_AMBIENT, gold_amb );
glMaterialfv( GL_FRONT, GL_DIFFUSE, gold_diff );
glMaterialfv( GL_FRONT, GL_SPECULAR, gold_spec );
glMaterialf( GL_FRONT, GL_SHININESS, gold_shin );
glPushMatrix();
glTranslatef( x, y, z );
auxSolidTeapot( 1.0 );
glPopMatrix();
}
void CALLBACK display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
draw_red_teapot( -4.0, -0.5, -1.0 );
draw_red_teapot( -2.0, -0.5, -2.0 );
draw_red_teapot( 0.0, -0.5, -3.0 );
draw_red_teapot( 2.0, -0.5, -4.0 );
draw_red_teapot( 4.0, -0.5, -5.0 );
glFlush();
}
void CALLBACK resize( int w, int h )
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if ( w <= (h*3) )
glOrtho( -6.0, 6.0, -2.0*((float)h*3)/(float)w,
2.0*((float)h*3)/(float)w, 0.0, 10.0 );
else
glOrtho( -6.0*(float)w/((float)h*3),
6.0*(float)w/((float)h*3), -2.0, 2.0, 0.0, 10.0 );
gluLookAt( 0,0,3, 0,0,0, 0,1,0 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main()
{
auxInitDisplayMode( AUX_SINGLE | AUX_RGBA | AUX_DEPTH );
auxInitPosition( 0, 0, 450, 150 );
auxInitWindow( "Лекция 6. Программа 6.4" );
light_init();
auxMouseFunc( AUX_LEFTBUTTON, AUX_MOUSEDOWN, cycle_fog );
auxReshapeFunc( resize );
auxMainLoop( display );
}
Программа 6.4. Пять чайников в тумане.
