Что такое OpenGL?

Содержание

Слайд 2

Что такое OpenGL? OpenGL – кросс-платформенная библиотека функций для создания интерактивных

Что такое OpenGL?

OpenGL – кросс-платформенная библиотека функций для создания интерактивных 2D

и 3D приложений
Является отраслевым стандартом с 1992 года
Основой стандарта стала библиотека IRIS GL, разработанная фирмой Silicon Graphics Inc.
http://www.opengl.org
OpenGL (Open Graphics Library – открытая графическая библиотека) -спецификация, определяющая независимый от языка программирования платформонезависимый программный интерфейс для написания приложений, использующих двухмерную и трёхмерную компьютерную графику.
Слайд 3

Преимущества Аналогичные библиотеки: DirectX (Direct3D), Vulkan, Java 3D OpenGL Стабильность (с

Преимущества

Аналогичные библиотеки: DirectX (Direct3D), Vulkan, Java 3D
OpenGL
Стабильность (с 1992 г.)
Производители оборудования

создают реализации библиотеки согласно этой спецификации (Nvidia, AMD/ATi )
Переносимость
Независимость от оконной и операционной системы
Легкость применения
Простой интерфейс, реализации для различных ЯП
Низкие затраты на обучение
Слайд 4

Основной особенностью OpenGL можно считать простоту. Ядро OpenGL контролирует процесс обработки

Основной особенностью OpenGL можно считать простоту. Ядро OpenGL контролирует процесс обработки

примитивов.
Для передачи данных используется процедурная модель.
В каждый момент времени состояние OpenGL определяется через набор переменных, задающих параметры обработки. Каждый новый переданный треугольник проходит обработку в соответствии с текущим состоянием.
Слайд 5

Состоит из набора библиотек AGL, GLX, WGL Связь между OpenGL и

Состоит из набора библиотек

AGL, GLX, WGL
Связь между OpenGL и оконной

системой
GLU (OpenGL Utility Library)
Часть OpenGL
NURBS, tessellators, quadric shapes, etc
GLUT (OpenGL Utility Toolkit)
Переносимый оконный API
Неофициальная часть OpenGL
Слайд 6

С какими геометрическими моделями работает OpenGL? OpenGL работает с моделями, заданными

С какими геометрическими моделями работает OpenGL?

OpenGL работает с моделями, заданными в

граничном полигональном представлении

Поверхность приближается набором полигональных граней (face, polygon)
Границы граней описываются ребрами (egde)
Часть отрезка, формирующего ребро, заканчивается вершинами (vertex)

Слайд 7

Конвейер Обработка вершин и сборка примитивов Вершина любого объекта в момент

Конвейер

Обработка вершин и сборка примитивов

Вершина любого объекта в момент определения немедленно

передается в конвейер, и проходит все его ступени
Слайд 8

Как рисовать объекты с помощью OpenGL? Объекты на экране рисуются путем

Как рисовать объекты с помощью OpenGL?

Объекты на экране рисуются путем последовательной

передачи в конвейер вершин примитивов, которые составляют объект
команды передача данных
Обработка данных на каждом этапе конвейера может быть настроена через
команды изменения состояния
Слайд 9

Команды OpenGL glVertex3fv ( v ) 2 – (x, y) 3

Команды OpenGL

glVertex3fv ( v )

2 – (x, y) 3 – (x, y,

z) 4 – (x, y, z, w)

Число компонент

B – byte ub – unsigned byte s – short us – unsigned short I – int ui – unsigned int f – float d – double

Тип данных

«v» отсутствует для скалярных форм
glVertex2f(x,y)

Вектор

Слайд 10

Модель begin/end void glMatrixMode(…); void glLoadIdentity(); void glMultMatrixd(…); void glBegin(GLenum type);

Модель begin/end

void glMatrixMode(…);
void glLoadIdentity();
void glMultMatrixd(…);

void glBegin(GLenum type);

void glVertex(…);
void glNormal(…);
void glColor(…);

void glEnd();

T&L

Rasterization

Pixel

Ops

void glTexture2d(…);
void glTexEnv(…);
void glPolygonMode(…);

void glDepthFunc(…);
void glBlendFunc(…);
void glStencilOp(…);

Слайд 11

Пример программы Цветной треугольник glBegin(GL_TRIANGLES); glColor2f(0.0f,1.0f); glVertex2f(150.0f, 50 .0f); glVertex2f(50.0f, 150

Пример программы

Цветной треугольник
glBegin(GL_TRIANGLES);
glColor2f(0.0f,1.0f);
glVertex2f(150.0f, 50 .0f);
glVertex2f(50.0f, 150 .0f);
glVertex2f(200 .0f, 200 .0f);
glEnd();

Слайд 12

Типы примитивов OpenGL GL_LINE_LOOP

Типы примитивов OpenGL

GL_LINE_LOOP

Слайд 13

Атрибуты вершин Каждая вершина кроме положения в пространстве может иметь несколько

Атрибуты вершин

Каждая вершина кроме положения в пространстве может иметь несколько других

атрибутов
Материал
Цвет
Нормаль
Текстурные координаты
Внимание: всегда используется ТЕКУЩИЙ набор атрибутов
OpenGL – конечный автомат
Слайд 14

Сложные фигуры void gluSphere (GLUquadricObj * qobj, GLdouble radius, GLint slices,

Сложные фигуры

void gluSphere (GLUquadricObj * qobj, GLdouble radius,
GLint slices, GLint

stacks)
void gluCylinder (GLUquadricObj * qobj,
GLdouble baseRadius,
GLdouble topRadius,
GLdouble height, GLint slices,
GLint stacks)
void gluDisk(GLUquadric* quad,
GLdouble inner,
GLdouble outer,
GLint slices,
GLint loops)
параметры slices, stacks задают число разбиений
Слайд 15

gluSphere()

gluSphere()

Слайд 16

Преобразования координат в OpenGL Каждая вершина объекта задается в локальных координатах

Преобразования координат в OpenGL

Каждая вершина объекта задается в локальных координатах модели
Необходимо

определить набор геометрических преобразований, таких, что каждая вершина преобразуется в точку на плоскости экрана
Три последовательных преобразования:
модельное преобразование
видовое преобразование
проективное преобразование
Слайд 17

Последовательность преобразований

Последовательность преобразований

Слайд 18

Графический конвейер

Графический конвейер

Слайд 19

void glMatrixMode(Glenum mode); mode={GL_MODELVIEW|GL_PROJECTION} void glLoadIdentity(); void glMultMatrixd(GLdouble c[16]); Выбираем матрицу

void glMatrixMode(Glenum mode);
mode={GL_MODELVIEW|GL_PROJECTION}

void glLoadIdentity();

void glMultMatrixd(GLdouble c[16]);

Выбираем матрицу преобразований для

изменения:

Две основные операции над матрицами:

Матрицы преобразований

Слайд 20

void glTranslated(GLdouble x, GLdouble y, GLdouble z); void glScaled(GLdouble x, GLdouble

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);

Модельно-Видовые преобразования

Слайд 21

Проекции. Параллельная void glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble

Проекции. Параллельная

void glOrtho (GLdouble left, GLdouble right,
GLdouble bottom, GLdouble

top,
GLdouble near, GLdouble far)
void gluOrtho2D (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)

Параметры near и far задают расстояние до ближней и дальней плоскостей отсечения по удалению от точки (0,0,0) и могут быть отрицательными

Слайд 22

Перспективная проекция void gluPerspective (angley, aspect, znear, zfar) Параметр angley определяет

Перспективная проекция

void gluPerspective (angley, aspect, znear, zfar)
Параметр angley определяет угол видимости в

градусах по оси у и должен находиться в диапазоне от 0 до 180.
Угол видимости вдоль оси x задается параметром aspect, который обычно задается как отношение сторон области вывода
Параметры zfar и znear задают расстояние от наблюдателя до плоскостей отсечения по глубине и должны быть положительными
Слайд 23

X Y Z 0 O1 O2 A1 B1 C1 D1 A2

X

Y

Z

0

O1

O2

A1

B1

C1

D1

A2

B2

C2

D2

void gluPerspective(GLdouble angley,
GLdouble aspect,
GLdouble znear,
GLdouble zfar);

angley = D1OA1

(в градусах)
aspect = C1D1/D1A1
znear = |OO1|
zfar = |OO2|
Слайд 24

gluLookAt( eyex, eyey, eyez, aimx, aimy, aimz, upx, upy, upz) Настройка

gluLookAt( eyex, eyey, eyez, aimx, aimy, aimz, upx, upy, upz)

Настройка

виртуальной камеры

eye – координаты наблюдателя

aim – координаты “цели”

up – направление вверх

Видовое преобразование

Слайд 25

Источники света void glLight[i f] (GLenum light, GLenum pname, GLfloat param)

Источники света

void glLight[i f] (GLenum light, GLenum pname,
GLfloat param)
void

glLight[i f] (GLenum light, GLenum pname,
GLfloat *params)
light однозначно определяет источник света от 0 до 8
Определение свойств материала объекта имеет смысл, только если в сцене есть источники света. Иначе все объекты будут черными (или, строго говоря, иметь цвет, равный рассеянному цвету материала
Слайд 26

Виды материалов Параметры pname:

Виды материалов

Параметры pname:

Слайд 27

Для использования освещения сначала надо установить соответствующий режим вызовом команды glEnable(GL_LIGHTNING),

Для использования освещения сначала надо установить соответствующий режим вызовом команды glEnable(GL_LIGHTNING),

а затем включить нужный источник командой glEnable(GL_LIGHTi).
Слайд 28

Фотореализм

Фотореализм

Слайд 29


Слайд 30

Слайд 31

DirectX DirectX - набор API, разработанных для решения задач, связанных с

DirectX

DirectX - набор API, разработанных для решения задач, связанных с программированием

под Microsoft Windows. Наиболее широко используется при написании компьютерных игр.
DirectX состоит из:
Direct3D (D3D): интерфейс вывода трёхмерных примитивов.
DirectInput: интерфейс, используемый для обработки данных, поступающих с клавиатуры, мыши, джойстика и пр. игровых контроллеров.
DirectSound: интерфейс низкоуровневой работы со звуком (формата Wave) Direct2D : интерфейс вывода двухмерной графики
Слайд 32

Структура DirectX значительно отличается от OpenGL. DirectX основан на модели COM

Структура DirectX значительно отличается от OpenGL. DirectX основан на модели COM

(Component Object Model). Это означает, что в отличие от простого вызова функций эта модель предполагает выполнение некоторых дополнительных действий, связанных с компонентной архитектурой DirectX.
Слайд 33

Vulkan API Vulkan API — это низкоуровневые кроссплатформенные программные интерфейсы, которые

Vulkan API

Vulkan API — это низкоуровневые кроссплатформенные программные интерфейсы, которые выдают

более высокую производительность 3D-графики за счёт снижения издержек по сравнению с другими API типа OpenGL, особенно при наличии специальных функций GPU (API подходит также для рендеринга 2D).
При грамотной реализации Vulkan обеспечивает «от маргинального до полиномиального повышения скорости по сравнению с другими API на том же оборудовании».
Слайд 34

Разработчик Khronos Group представил Vulkan API в рамках конференции GDC 2015,

Разработчик Khronos Group представил Vulkan API в рамках конференции GDC 2015,

а первый релиз состоялся в феврале 2016 года. Первоначально Vulkan API носили название «следующее поколение OpenGL» или просто glNext, но потом название сменили на Vulkan.
Эта технология сильно ускоряет 3D-графику и снижает нагрузку на процессор по примеру Direct3D. Но проблема в том, что Vulkan API требует от разработчика гораздо больше усилий, в то время как API более высокого уровня, такие как OpenGL и DirectX упрощают многие вещи, например, управление памятью.
Слайд 35

Литература Ю. Тихомиров. OpenGL. Программирование трехмерной графики, БХВ – Петербург, 2002

Литература

Ю. Тихомиров. OpenGL. Программирование трехмерной графики, БХВ – Петербург, 2002

Эдвард Энджел.

Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е изд., Вильямс, 2001