- •Часть 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
Лекция 6. Свойства материала и спецэффекты освещения
1. Задание свойств материала
На общее освещение сцены и вид объектов, кроме источников света, влияют также отражающие и поглощающие свойства объектов – свойства материала, из которого "сделаны" объекты. Часть этих свойств похожи на свойства источников света: рассеянная, диффузная и зеркально отраженная компоненты света. Есть также свойства "блеск" и "излучаемый свет". Все свойства материала задаются с помощью функции:
void glMaterial{if}[v](GLenum face, GLenum pname, TYPE param);
Параметр pname выбирает свойство материала (табл. 6.1), face указывает сторону объектов (GL_FRONT, GL_BACK или GL_FRONT_AND_BACK). Новое значение свойства передается в параметре param. Значение блеска (GL_SHININESS) можно передать непосредственно, а для остальных свойств надо передавать указатель на массив. У многих материалов рассеянная и диффузная компоненты одинаковые, поэтому pname, равное GL_AMBIENT_AND_DIFFUSE, позволяет задать сразу два свойства.
В табл. 6.1 обратите внимание, что значения большинства свойств материалов – это цветовые значения (R, G, B, A). Назначение цветовой компоненты A (альфа) будет рассмотрено далее в п.2 "Смешение цветов".
Таблица 6.1. Свойства материала
Константа для выбора свойства |
Значение по умолчанию |
Смысл |
GL_AMBIENT |
(0.2, 0.2, 0.2, 1.0) |
Цвет рассеянной компоненты света, отражаемого материалом. |
GL_DIFFUSE |
(0.8, 0.8, 0.8, 1.0) |
Цвет диффузно отражаемой компоненты |
GL_AMBIENT_AND_DIFFUSE |
|
Одинаковый цвет диффузно отражаемой и рассеянной компонент |
GL_SPECULAR |
(0.0, 0.0, 0.0, 1.0) |
Цвет зеркально отражаемой компоненты |
GL_SHININESS |
0.0 |
Блеск (показатель экспоненты для расчета зеркального отражения) |
GL_EMISSION |
(0.0, 0.0, 0.0, 1.0) |
Цвет излучаемой компоненты |
1.1 Диффузное и рассеянное отражение
Цвет диффузно и рассеянно отраженного объектом света задается свойствами GL_DIFFUSE и GL_AMBIENT. Видимый цвет объекта в основном определяется диффузным отражением. Его интенсивность зависит от угла падения света. Диффузно отраженный свет имеет максимальную интенсивность, когда свет падает перпендикулярно поверхности. Диффузное отражение происходит по всем направлениям, так что видимый цвет объекта от положения наблюдателя не зависит.
Рассеянное отражение тоже влияет на видимый цвет объекта. Т.к. диффузное отражение ярче при прямом освещении, то рассеянное отражение становится заметным, когда нет прямого падения света на объект. Полное рассеянное отражение объекта формируется из фонового рассеянного света и рассеянного света источников. Рассеянно отраженный свет (как и диффузно отраженный), не зависит от положения наблюдателя.
У многих реальных объектов диффузное и рассеянное отражение одного цвета. Поэтому в OpenGL есть возможность одновременного задания этих свойств одним вызовом glMaterial*(). Например, для задания обеим сторонам многоугольников глубокого синего цвета в качестве диффузного и рассеянного отражения, надо произвести вызов:
float ambdiff[] = { 0.1, 0.5, 0.8, 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, ambdiff);
