- •Часть 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. Автоматическое повторение текстуры на плоском многоугольнике
Режим автоматического повторения текстуры включается/выключается с помощью свойств текстуры GL_TEXTURE_WRAP_S и GL_TEXTURE_WRAP_T. Буквами S и T в OpenGL обозначаются горизонтальная и вертикальная координата текстуры. Для автоповторения текстуры в заданном направлении соответствующее свойство должно быть равно GL_REPEAT (значение по умолчанию). Для отключения автоповторения этому свойству надо присвоить значение GL_CLAMP.
Ниже приведены изменения, которые надо внести в функцию display() программы 7.1, чтобы текстура на передней грани куба была повторена 3 раза по горизонтали и 2 раза по вертикали.
void CALLBACK display()
{
...
glBindTexture( GL_TEXTURE_2D, falls_tex );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glBegin( GL_QUADS );
glTexCoord2d( 0, 0 ); glVertex3d( -3, -3, 0 );
glTexCoord2d( 0, 2 ); glVertex3d( -3, 3, 0 );
glTexCoord2d( 3, 2 ); glVertex3d( 3, 3, 0 );
glTexCoord2d( 3, 0 ); glVertex3d( 3, -3, 0 );
glEnd();
...
}
Фрагмент программы 7.2. Автоматическое повторение текстуры.
Функция glTexCoord2d() сопоставляет координаты текстуры и вершин примитива. Координаты левого нижнего угла текстуры равны (0,0), а правого верхнего – (1,1). Если в качестве параметров glTexCoord2d() указать значение, большее 1, то текстура будет повторяться (рис. 7.4). В программе 7.2 координата (0,0) текстуры привязывается к левой нижней вершине грани куба с координатой (-3,-3,0), а координата (3,2) текстуры – к правой верхней вершине (3,3,0). В результате по горизонтали на грань куба будет наложено три экземпляра текстуры, а по вертикали – 2 экземпляра.
Рис. 7.4. Задание координат для автоматического повторения текстуры.
5. Наложение текстуры на произвольную поверхность
В OpenGL есть режим автоматической генерации текстурных координат. Этот режим позволяет отказаться от использования glTexCoord2d() при решения нескольких типичных задач, таких, как демонстрация очертаний объекта с помощью контуров и построение отражения окружающей среды на блестящих объектах.
Для применения этого режима сначала требуется разрешить автоматическую генерацию координаты текстуры по одному или обоим направлениям с помощью вызова glEnable(GL_TEXTURE_GEN_S) и glEnable(GL_TEXTURE_GEN_T). После этого надо с помощью функции glTexGen() выбрать способ генерации текстурных координат.
void glTexGen{ifd}{v}(GLenum coord, GLenum pname, TYPE param);
Параметр coord выбирает координату GL_S или GL_T. Второй параметр pname равен GL_TEXTURE_GEN_MODE, а param задает функцию вычисления текстурных координат: GL_OBJECT_LINEAR, GL_EYE_LINEAR или GL_SPHERE_MAP.
Функции расчета текстурных координат GL_OBJECT_LINEAR и GL_EYE_LINEAR в основном применяются для нанесения контурных изображений на объект, чтобы показать его форму (например, с помощью одномерной текстуры в виде полоски).
Функция GL_SPHERE_MAP предназначена для имитации отражения окружающей среды блестящими объектами. Например, если посмотреть на полированный серебряный предмет внутри комнаты, то на его поверхности будет видно отражение стен, пола и предметов, находящихся внутри комнаты. Вид отражения зависит от положения наблюдателя и от ориентации блестящего предмета.
Отображение GL_SPHERE_MAP строится в предположении, что предметы в комнате расположены достаточно далеко от поверхности блестящего объекта и этот объект очень мал по сравнению с размерами комнаты. В таком приближении, чтобы рассчитать цвет точки поверхности объекта, выполняется построение луча от наблюдателя до поверхности и затем рассчитывается отражение этого луча от поверхности объекта. Направление отраженного луча определяет цвет пиксела объекта. Для применения режима GL_SPHERE_MAP необходимо подготовить текстуру специальным образом, так, чтобы она была похожа на фотографию реального блестящего объекта, сделанную с помощью широкоугольного объектива.
В целом, применение любой из трех описанных функций для получения регулярной текстуры на объекте является довольно сложным делом. Наложение нерегулярных хаотических текстур выполняется значительно проще и в ряде случаев может дать приемлемые результаты. В приведенной ниже функции display() из программы 7.3 демонстрируется наложение двух текстур на стандартные объекты GLAUX с применением трех различных функций генерации текстурных координат.
void CALLBACK display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glEnable( GL_TEXTURE_2D );
glEnable( GL_TEXTURE_GEN_S );
glEnable( GL_TEXTURE_GEN_T );
glColor3d( 1, 1, 1 );
glPushMatrix();
glTranslated( -3, 3, 0 );
glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
glBindTexture( GL_TEXTURE_2D, falls_tex );
auxSolidTeapot( 1.5 );
glTranslated( 6, 0, 0 );
glBindTexture( GL_TEXTURE_2D, sawdust_tex );
auxSolidTeapot( 1.5 );
glPopMatrix();
glPushMatrix();
glTranslated( -3, 0, 0 );
glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR );
glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR );
glBindTexture( GL_TEXTURE_2D, falls_tex );
auxSolidTeapot( 1.5 );
glTranslated( 6, 0, 0 );
glBindTexture( GL_TEXTURE_2D, sawdust_tex );
auxSolidTeapot( 1.5 );
glPopMatrix();
glPushMatrix();
glTranslated( -3, -3, 0 );
glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );
glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );
glBindTexture( GL_TEXTURE_2D, falls_tex );
auxSolidTeapot( 1.5 );
glTranslated( 6, 0, 0 );
glBindTexture( GL_TEXTURE_2D, sawdust_tex );
auxSolidTeapot( 1.5 );
glPopMatrix();
glDisable( GL_TEXTURE_GEN_S );
glDisable( GL_TEXTURE_GEN_T );
glDisable( GL_TEXTURE_2D );
auxSwapBuffers();
}
Фрагмент программы 7.3. Автоматическое наложение текстур.
