
- •Часть 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.2 Области применения смешения цветов
- •2.3 Пример использования смешения цветов
- •3. Туман
- •3.1 Использование тумана
- •4. Сводка результатов
- •5. Упражнения Упражнение 1
- •2. Назначение текстур
- •3. Создание текстуры в оперативной памяти
- •4. Автоматическое повторение текстуры на плоском многоугольнике
- •5. Наложение текстуры на произвольную поверхность
- •6. Сводка результатов
- •7. Упражнения Упражнение 1
- •Упражнение 2
- •Задание 1.1
- •2. Объемный "тетрис"
- •Задание 2.1
4. Сводка результатов
OpenGL позволяет задавать свойства материала, который приписывается объектам сцены. Значения этих свойств используются в модели освещения при вычислении цвета пикселей изображения сцены. Основными свойствами материала являются компоненты диффузного, рассеянного и зеркального отражения. Эти свойства напоминают свойства источников света. Кроме того, у материала есть свойство "блеск" и может быть свойство "излучаемый свет", который влияет только на вид объекта и не играет роли нового источника света. В лекции приведена таблица со свойствами материала, которые соответствуют некоторым реальным материалам.
Значения цвета в OpenGL задаются четырьмя компонентами RGBA. Четвертая компонента A (альфа) используется в служебных целях для расчета цвета пикселей в режиме смешения цветов. В лекции описано, как применить режим смешения цветов для реализации одного из наиболее распространенных эффектов освещения – прозрачности.
Компьютерные изображения в некоторых случаях выглядят чересчур высококачественными и нереалистичными. Одно из простейших средств повышения реалистичности изображений – туман. OpenGL позволяет задать ряд свойств тумана, например, цвет и плотность. Когда туман включен, то по мере удаления от наблюдателя объекты постепенно расплываются и закрашиваются цветом тумана.
5. Упражнения Упражнение 1
На основе фрагмента программы 6.1 напишите программу, рисующую 12 сфер с различными свойствами материала. Сферы должны располагаться в три строки, которые отличаются рассеянной составляющей:
Cтрока 1 – рассеянная компонента отсутствует, т.е. равна {0.0, 0.0, 0.0, 0.0};
Cтрока 2 – серая рассеянная компонента, {0.7, 0.7, 0.7, 1.0};
Cтрока 3 – желтая рассеянная компонента, {0.8, 0.8, 0.2, 1.0}.
Свойства материала в разных столбцах задаются аналогично фрагменту 6.1:
Столбец 1 – синяя диффузная составляющая { 0.1, 0.5, 0.8, 1.0 }, зеркальная отсутствует, блеска нет;
Столбец 2– синяя диффузная, белая зеркальная { 1.0, 1.0, 1.0, 1.0 } и малый блеск 5.0;
Столбец 3 – синяя диффузная, белая зеркальная, большой блеск 100.0;
Столбец 4 – синяя диффузная, нет зеркальной, нет блеска, но есть зеленоватая излучаемая компонента {0.3, 0.2, 0.2, 0.0}.
Обратите внимание, как меняется вид сфер, например, светящиеся сферы выглядят довольно яркими и однородными (т.к. нет зеркальной составляющей).
Упражнение 2
Выполните программу 6.2 и затем добавьте в нее обработчики событий для изменения блеска и излучаемой компоненты.
Упражнение 3
На основе фрагмента программы 6.3 разработайте программу для рисования сферы внутри полупрозрачного цилиндра. Измените ее так, чтобы цилиндр и сфера рисовались внутри третьего объекта (например, полупрозрачной сферы).
Упражнение 4
Выполните программу 6.4. Выясните, как влияют на вид объектов режим автоматического вычисления нормалей и автоматической нормализации нормалей:
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
Попробуйте назначить объектам несколько различных материалов, приведенных в табл. 6.2.
ЛЕКЦИЯ 7. Растровые объекты: изображения и текстуры
1. Вывод изображений в буфер OpenGL
Изображение – это двумерный массив, в котором хранятся значения цветов отдельных пикселов. Существует большое количество форматов изображений, отличающихся способом представления цветовых значений (например, формат RGB, RGBA, BGR, палитровый формат) и расположением пикселов внутри массива (например, изображение может храниться в массиве в направлении сверху-вниз или снизу вверх). На дисках изображения записываются в различных графических файловых форматах (BMP, PCX, GIF, JPEG и др.), которые в основном отличаются способами упаковки повторяющихся цветовых значений для сокращения размера файла.
В OpenGL есть функции для работы с изображениями, хранящимися в памяти в виде массива пикселей, но нет функций для чтения/записи графических файлов. Выполнять дисковые операции требуется с помощью других библиотек. В памяти OpenGL позволяет хранить изображения разными способами: значения цвета пикселей может храниться в виде RGB, BGR, RGBA и др. Рассмотрим один из наиболее часто используемых форматов – цвет пиксела хранится в формате RGB и занимает три байта (по байту на каждую из трех компонент). Строки хранятся в памяти последовательно, в порядке снизу-вверх. В библиотеке GLAUX есть функция для загрузки подобного изображения в память из BMP-файла:
AUX_RGBImageRec* auxDIBImageLoadA( const char* filename );
Эта функция возвращает указатель на структуру с динамически созданным изображением:
struct AUX_RGBImageRec {
int sizeX, sizeY; // Ширина и высота изображения
unsigned char* data; // Пикселы изображения
};
Для вывода изображения из памяти в буфер кадра в OpenGL предназначена функция glDrawPixels():
void glDrawPixels( int width, height, GLenum format,
GLenum type, const void* pixels );
Чтобы с помощью этой функции вывести изображение в буфер кадра, надо выполнить следующие действия:
загрузить изображение из файла в память;
указать способ хранения изображения в памяти и выравнивание;
установить точку начала вывода изображения (координату его левого нижнего угла)
вывести изображение в буфер.
Рассмотрим выполнение этих действий на примере изображения SUNFLOWR.BMP, сохраненного в формате RGB, 24 бита на пиксел. Сначала в программе надо объявить глобальную переменную:
AUX_RGBImageRec* pImage = NULL;
Затем в функции main() перед входом в главный цикл auxMainLoop( display ) надо внести строку:
pImage = auxDIBImageLoad( "sunflowr.bmp" );
После выхода из главного цикла, перед завершением программы, надо добавить удаление динамически созданного изображения:
delete pImage;
Для вывода этого изображения в буфер кадра в функцию display() надо внести следующие строки:
glRasterPos3d( -3, -2, 1 ); // Нижний левый угол изображения
glPixelZoom( 1, 1 ); // Коэффициенты масштабирования по
// ширине и высоте
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); // Способ хранения
// изображения в памяти
glDrawPixels( pImage->sizeX, pImage->sizeY, // Ширина и высота в пикселах
GL_RGB, // Формат цвета пикселов
GL_UNSIGNED_BYTE, // Формат цветовых компонент
pImage->data ); // Данные изображения
При выводе в буфер изображения выводятся в масштабе, который задается функцией glPixelZoom(). Модельные преобразования на изображение не влияют, оно всегда выводится "параллельно плоскости экрана". Изображения удобно использовать в качестве статического фона. С помощью несложных преобразований можно сформировать изображение с прозрачными областями (см. упражнение 2).