Введение в opengl
DESCRIPTION
Введение в OpenGL. Лекция 9 Алексей Игнатенко. На лекции. Что такое OpenGL Архитектура OpenGL Работа с библиотекой Команды OpenGL Определение геометрии Преобразование геометрии Проекции. Фотореализм vs. Скорость. Фотореализм трассировка лучей излучательность. Скорость - PowerPoint PPT PresentationTRANSCRIPT
Введение в 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)Литература (2)Ю. Тихомиров. OpenGL. Программирование трехмерной графики, БХВ – Петербург, 2002
Эдвард Энджел. Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е изд., Вильямс, 2001
Литература (3)Литература (3)Ву Мейсон, Нейдер Джеки, Девис Том, Шрайнер Дейв. OpenGL. Руководство по программиста. Диа-Софт, 2002.
Френсис Хилл. OpenGL. Программирование компьютерной графики. Для профессионалов. Питер. 2002
Организация OpenGL
Состоит из набора библиотек • пример для Win32
Прикладная программаПрикладная программа
GLUGLU
GLGL
GLUTGLUT
Win32 APIWin32 API
Буфер кадраБуфер кадра
Сопутствующие APIAGL, GLX, WGL• Связь между OpenGL и оконной системой
GLU (OpenGL Utility Library)• Часть OpenGL• NURBS, tessellators, quadric shapes, etc
GLUT (OpenGL Utility Toolkit)• Переносимый оконный API• Неофициальная часть OpenGL
Прикладная программаПрикладная программа
GLUGLU
GLGL
GLUTGLUT
Win32 APIWin32 API
Буфер кадраБуфер кадра
Что нужно для работы с OpenGLЧто нужно для работы с OpenGL
.cpp
opengl32.lib gl.h
glu32.lib glu.h
glut32.lib
glut.h
opengl32.dllglu32.dll
glut32.dll
.exeC++
Архитектура OpenGL
Клиент-сервер• Клиент - приложение
Конвейер• Данные обрабатываются последовательно, в
несколько этапов.
Набор команд• Использует аппаратуру, если возможно
Конечный автомат• Значение переменных – состояние• Команды изменяют состояние
С какими геометрическими моделями работает OpenGL?OpenGL работает с моделями, заданными в полигональном представлении
Поверхность приближается набором полигональных граней (face, polygon)
Границы граней описываются ребрами (egde)
Часть отрезка, формирующего ребро, заканчивается вершинами (vertex)
КонвейерОбработка вершин и сборка примитивовОбработка вершин и сборка примитивов
Растеризация и обработка фрагментовРастеризация и обработка фрагментов
Операции над пикселямиОперации над пикселями
Передача данных в буфер кадраПередача данных в буфер кадра
ТекстурыТекстуры
Источники светаИсточники света
Атрибуты вершинАтрибуты вершин
Вершина любого объекта в момент определения немедленно передается в конвейер, и проходит все его ступени
Терминология
Графический примитив• Точка, линия, многоугольник и т.д.
Команда OpenGL• Вызов функции библиотеки
Вершина• Определяет точку, конец отрезка или
угол многоугольника
Атрибут вершины• Цвет, нормаль, текстурные координаты и
т.д.
Терминология (2)
Тип примитива + набор вершин + набор атрибутов = объектНабор объектов + набор источников света + камера = сценаИзменение положения камеры = перемещение по сцене.Изменение положения объектов в сцене или атрибутов = анимация
Как рисовать объекты с помощью OpenGL?
Объекты на экране рисуются путем последовательной передачи в конвейер вершин примитивов, которые составляют объект
•команды передача данных
Обработка данных на каждом этапе конвейера может быть настроена через
•команды изменения состояния
Команды OpenGL
Описание примитивов• Точки, треугольники
Описание источников света• Положение, цвет и т.д.
Задание атрибутов• Цвет, материал, текстура примитива
Геометрические преобразования• Поворот, перенос объектов, положение камеры
Визуализация• Управление отображением на экран
Формат команд OpenGL
glVertex3fv ( v )
2 – (x, y)3 – (x, y, z)4 – (x, y, z, w)
Число компонент
B – byteub – unsigned bytes – shortus – unsigned shortI – intui – unsigned intf – floatd – double
Тип данных
«v» отсутствует для скалярных форм
glVertex2f(x,y)
Вектор
Определение примитивов в OpenGL
Объект определяется с помощью набора граней, грани задаются через задание набора вершин
glVertex{234}{df}[v]()• команда определения положения вершины
Для получения примитива необходимо связать вершины между собой
Для этого используется так называемая модель Begin/End
glBegin( prim_type );glEnd();
glVertex{234}{df}[v]()
Типы примитивов OpenGL
GL_POINTS GL_LINES GL_LINE_STRIP
GL_POLIGON
GL_TRIANGLES
GL_QUADS
GL_TRIANGLE_STRIPGL_QUAD_STRIPE
Атрибуты вершин
Каждая вершина кроме положения в пространстве может иметь несколько других атрибутов
•Материал•Цвет•Нормаль•Текстурные координаты
Внимание: всегда используется ТЕКУЩИЙ набор атрибутов
•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();
Таким образом можно задать любой объект! Теперь задача в том, чтобы показать этот объект на экране
Демо
Процесс визуализации
Задать окно для рисованияОпределить константные атрибуты и свойства
(источники света, текстуры и т.д.)На каждом кадре:
1. Очистить буфер кадра2. Задать положение наблюдателя3. Для каждого объекта
1. Определить преобразование2. Передать атрибуты3. Передать геометрию
4. Обновить содержимое окна
Определение окна для рисования
glViewport(x, y, width, height)
Команда задает окно внутри текущего окна, в которое будет производится вывод OpenGL
Работа с буфером кадра
1) Задание цвета для заполнения буфера кадра
glClearColor(red, green, blue, alpha)
2) Заполнение экранных буферов
glClear(GL_COLOR_BUFFER_BIT);
]1,0[alphablue,green,red,
Преобразования координат в OpenGL
Каждая вершина объекта задается в локальных координатах модели
Необходимо определить•модельно-видовое преобразование •проективное преобразование
Преобразование координатПреобразование координат
0MVVe
Отсечение:
ccd
ccd
ccd
wzz
wyy
wxx
/
/
/
Viewport
Vi={Ps,RGBA,…}
]1,1[
]1,1[
]1,1[
d
d
d
z
y
x
0
0
0
0
0
w
z
y
x
V
e
e
e
e
e
w
z
y
x
V
ec PVV
c
c
c
c
c
w
z
y
x
V
ccc
ccc
ccc
wzw
wyw
wxw
Матрицы преобразованийМатрицы преобразований
void glMatrixMode(Glenum mode); mode={GL_MODELVIEW|GL_PROJECTION}
void glLoadIdentity();
EM void glMultMatrixd(GLdouble c[16]);
]15[]11[]7[]3[
]14[]10[]6[]2[
]13[]9[]5[]1[
]12[]8[]4[]0[
cccc
cccc
cccc
cccc
MM
Выбираем матрицу преобразований для изменения:
Две основные операции над матрицами:
Матрицы преобразований (2)Матрицы преобразований (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);
Стек матриц Стек матриц
glLoadIdentity();glTranslated(…);
glPushMatrix();glRotated(…);glPopMatrix();
glPushMatrix();glRotataed(…);glPopMatrix();
E
T
TT*R1
TT*R2
T
Модельно-видовое преобразование
OpenGL не имеет раздельных матриц для видового и модельного преобразования
Поэтому нужно задавать сразу произведение:
mdlview MMM
Модельное преобразование
Обычно перенос, поворот, масштабирование модели
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Как работает gluPerspective
X
Y
Z
0
O1
O2
A1B1
C1 D1
A2
B2
C2D2
void gluPerspective(GLdouble fov, GLdouble aspect, GLdouble znear, GLdouble zfar);
fov = D1OA1 (в градусах)aspect = C1D1/D1A1
znear = |OO1|zfar = |OO2|
Итоги
OpenGL•Кросс-платформенная библиотека функций
для создания интерактивных 2D и 3D приложений
Архитектура•Клиент-сервер, конвейер, конечный автомат
Определение геометрии•glVertex, glBegin, glEnd
Преобразования геометрии•glMatrixMode, glTranslate, glRotate, glScale,
gluPerspective, … , glViewport