471 likes | 769 Views
Введение в OpenGL. Лекция 9 Алексей Игнатенко. На лекции. Что такое OpenGL Архитектура OpenGL Работа с библиотекой Команды OpenGL Определение геометрии Преобразование геометрии Проекции. Фотореализм vs. Скорость. Фотореализм трассировка лучей излучательность. Скорость
E N D
Введение в OpenGL Лекция 9 Алексей Игнатенко
На лекции • Что такое OpenGL • Архитектура OpenGL • Работа с библиотекой • Команды OpenGL • Определение геометрии • Преобразование геометрии • Проекции
Фотореализм vs. Скорость • Фотореализм • трассировка лучей • излучательность • Скорость • Метод преобразований
Что такое OpenGL? • OpenGL – кросс-платформенная библиотека функций для создания интерактивных 2D и 3D приложений • Является отраслевым стандартом с 1992 года • Основой стандарта стала библиотека IRIS GL, разработанная фирмой Silicon Graphics Inc. • Основная функция: интерактивная визуализация трехмерных моделей
Возможности • Вывод цветных изображений высокого качества, составленных из геометрических и других примитивов • Расчет освещения от нескольких источников света • Различные виды текстурирования • Удаление невидимых поверхностей • Анимация, трехмерные преобразования
Почему OpenGL? • Аналогичные библиотеки:DirectX (Direct3D), Java 3D • OpenGL • Стабильность (с 1992 г.) • Переносимость • Независимость от оконной и операционной системы • Легкость применения • Простой интерфейс, реализации для различных ЯП • Низкие затраты на обучение • Подходит для обучения студентов!
Литература • Ю.М. Баяковский, А.В. Игнатенко, А.И. Фролов. Графическая библиотека OpenGL. • Есть в библиотеке!
Литература (2) Ю. Тихомиров. OpenGL. Программирование трехмерной графики, БХВ – Петербург, 2002 Эдвард Энджел. Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е изд., Вильямс, 2001
Литература (3) Ву Мейсон, Нейдер Джеки, Девис Том, Шрайнер Дейв. OpenGL. Руководство по программиста. Диа-Софт, 2002. Френсис Хилл. OpenGL. Программирование компьютерной графики. Для профессионалов. Питер. 2002
Организация OpenGL • Состоит из набора библиотек • пример для Win32 GLU Буфер кадра Прикладная программа GL Win32 API GLUT
Сопутствующие API • AGL, GLX, WGL • Связь между OpenGL и оконной системой • GLU (OpenGL Utility Library) • Часть OpenGL • NURBS, tessellators, quadric shapes, etc • GLUT (OpenGL Utility Toolkit) • Переносимый оконный API • Неофициальная часть OpenGL GLU Буфер кадра Прикладная программа GL Win32 API GLUT
Что нужно для работы с OpenGL gl.h opengl32.lib opengl32.dll glu.h glu32.lib glu32.dll .exe C++ .cpp glut.h glut32.dll glut32.lib
Архитектура OpenGL • Клиент-сервер • Клиент - приложение • Конвейер • Данные обрабатываются последовательно, в несколько этапов. • Набор команд • Использует аппаратуру, если возможно • Конечный автомат • Значение переменных – состояние • Команды изменяют состояние
С какими геометрическими моделями работает OpenGL? • OpenGL работает с моделями, заданными в полигональном представлении Поверхность приближается набором полигональных граней (face, polygon) Границы граней описываются ребрами (egde) Часть отрезка, формирующего ребро, заканчивается вершинами (vertex)
Атрибуты вершин Источники света Текстуры Растеризация и обработка фрагментов Операции над пикселями Передача данных в буфер кадра Конвейер Обработка вершин и сборка примитивов Вершина любого объекта в момент определения немедленно передается в конвейер, и проходит все его ступени
Терминология • Графический примитив • Точка, линия, многоугольник и т.д. • Команда OpenGL • Вызов функции библиотеки • Вершина • Определяет точку, конец отрезка или угол многоугольника • Атрибут вершины • Цвет, нормаль, текстурные координаты и т.д.
Терминология (2) • Тип примитива + набор вершин + набор атрибутов = объект • Набор объектов + набор источников света + камера = сцена • Изменение положения камеры = перемещение по сцене. • Изменение положения объектов в сцене или атрибутов = анимация
Как рисовать объекты с помощью OpenGL? • Объекты на экране рисуются путем последовательной передачи в конвейер вершин примитивов, которые составляют объект • команды передача данных • Обработка данных на каждом этапе конвейера может быть настроена через • команды изменения состояния
Команды OpenGL • Описание примитивов • Точки, треугольники • Описание источников света • Положение, цвет и т.д. • Задание атрибутов • Цвет, материал, текстура примитива • Геометрические преобразования • Поворот, перенос объектов, положение камеры • Визуализация • Управление отображением на экран
Тип данных B – byteub – unsigned bytes – shortus – unsigned shortI – intui – unsigned intf – floatd – double Число компонент Вектор «v» отсутствует для скалярных форм glVertex2f(x,y) 2 – (x, y)3 – (x, y, z)4 – (x, y, z, w) Формат команд OpenGL glVertex3fv( v )
Определение примитивов в OpenGL • Объект определяется с помощью набора граней, грани задаются через задание набора вершин • glVertex{234}{df}[v]() • команда определения положения вершины • Для получения примитива необходимо связать вершины между собой • Для этого используется так называемая модель Begin/End glBegin( prim_type ); glEnd(); glVertex{234}{df}[v]()
GL_POINTS GL_LINES GL_LINE_STRIP GL_TRIANGLES GL_TRIANGLE_STRIP GL_QUAD_STRIPE GL_POLIGON GL_QUADS Типы примитивов OpenGL
Атрибуты вершин • Каждая вершина кроме положения в пространстве может иметь несколько других атрибутов • Материал • Цвет • Нормаль • Текстурные координаты • Внимание: всегда используется ТЕКУЩИЙ набор атрибутов • OpenGL – конечный автомат
Пример кода • Цветной треугольник glBegin(GL_TRIANGLES); glColor2f(0.0f,1.0f); glVertex2f(150.0f, 50 .0f); glVertex2f(50.0f, 150 .0f); glVertex2f(200 .0f, 200 .0f); glEnd(); • Таким образом можно задать любой объект! Теперь задача в том, чтобы показать этот объект на экране Демо
Процесс визуализации • Задать окно для рисования • Определить константные атрибуты и свойства (источники света, текстуры и т.д.) • На каждом кадре: • Очистить буфер кадра • Задать положение наблюдателя • Для каждого объекта • Определить преобразование • Передать атрибуты • Передать геометрию • Обновить содержимое окна
Определение окна для рисования • glViewport(x,y, width, height) • Команда задает окно внутри текущего окна, в которое будет производится вывод OpenGL
Работа с буфером кадра • 1) Задание цвета для заполнения буфера кадра • glClearColor(red, green, blue, alpha) • 2) Заполнение экранных буферов • glClear(GL_COLOR_BUFFER_BIT);
Преобразования координат в OpenGL • Каждая вершина объекта задается в локальных координатах модели • Необходимо определить • модельно-видовое преобразование • проективное преобразование
Преобразование координат Viewport Отсечение: Vi={Ps,RGBA,…}
Матрицы преобразований • Выбираем матрицу преобразований для изменения: void glMatrixMode(Glenum mode); mode={GL_MODELVIEW|GL_PROJECTION} • Две основные операции над матрицами: void glLoadIdentity(); void glMultMatrixd(GLdouble c[16]);
Матрицы преобразований (2) void glTranslated(GLdouble x, GLdouble y, GLdouble z); void glScaled(GLdouble x, GLdouble y, GLdouble z); void glRotated(GLdouble angle, GLdouble ax, GLdouble ay, GLdouble az); void gluPerspective(GLdouble fov, GLdouble aspect, GLdouble znear, GLdouble zfar);
Стек матриц E glLoadIdentity(); glTranslated(…); glPushMatrix(); glRotated(…); glPopMatrix(); glPushMatrix(); glRotataed(…); glPopMatrix(); T T T*R1 T T T*R2
Модельно-видовое преобразование • OpenGL не имеет раздельных матриц для видового и модельного преобразования • Поэтому нужно задавать сразу произведение:
Модельное преобразование • Обычно перенос, поворот, масштабирование модели • glTranslate, glRotate, glScale
Видовое преобразование • Настройка виртуальной камеры gluLookAt( eyex, eyey, eyez, aimx, aimy, aimz, upx, upy, upz) • eye – координаты наблюдателя • aim – координаты “цели” • up – направление вверх
Модельно-видовое преобразование (2) • glMatrixMode(GL_MODELVIEW); • gluLookAt(..); • glTranslate(…); • glRotate(…); • glTranslate(…); • glBegin(…); • … • glEnd(); Внимание! При определении геометрии к ней применяется текущий набор матриц преобразования! Виртуальная камера Модельное преобразование Демо Геометрия
Проективное преобразование • glMatrixModel(GL_PROJECTION); • gluPerspective(…)
Как работает gluPerspective void gluPerspective(GLdouble fov, GLdouble aspect, GLdouble znear, GLdouble zfar); D2 C2 Y O2 C1 D1 B2 O1 A2 B1 A1 0 fov = D1OA1 (в градусах) aspect = C1D1/D1A1 znear = |OO1| zfar = |OO2| Z X
Итоги • OpenGL • Кросс-платформенная библиотека функций для создания интерактивных 2D и 3D приложений • Архитектура • Клиент-сервер, конвейер, конечный автомат • Определение геометрии • glVertex, glBegin, glEnd • Преобразования геометрии • glMatrixMode, glTranslate, glRotate, glScale, gluPerspective, … , glViewport