**OpenGL** - кросс-платформенная библиотека функций для создания интерактивных 2D и 3D-приложений. Является отраслевым стандартом с 1992 года. Основой стандарта стала библиотека IRIS GL
OpenGL (Open Graphics Library - открытая графическая библиотека) - спецификация, определяющая независимый от языка программирования платформонезависимый программный интерфейс для написания приложений, использующих двумерную и трехмерную компьютерную графику
Аналогичные библиотеки: DirectX (Direct 3D), Vulkan, Java 3D
Преимущества:
- Стабильность (с 1992 года)
- Производители оборудования создают реализации библиотеки согласно этой спецификации (nVidia, AMD)
- Переносимость
- Независимость от оконной и операционной системы
- Легкость применения
- Простой интерфейс, реализации для различных языков программирования
- Низкие затраты на обучение  

Основной особенностью OpenGL можно считать простоту. Ядро OpenGL контролирует процесс обработки примитивов.  
Для передачи данных используется процедурная модель.  
В каждый момент времени состояние OpenGL определяется через набор переменных, задающих параметры обработки. Каждый новый переданный треугольник проходит обработку в соответствии с текущим состоянием  
Состоит из набора библиотек:
- AGL, GLX, WGL
- Связь между OpenGL и оконной системой
	- GLU (OpenGL Utility Library)
* Часть OpenGL
- NURBS
	* GLUT (OpenGL Utility Toolkit)
- Переносимый оконный API
- Неофициальная часть OpenGL
```cpp
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
```
## Геометрические модели
OpenGL работает с моделями, заданными в граничном полигональном представлении.  Поверхность приближается набором полигональных граней (face, polygon).  
Границы граней описываются ребрами (egde).  
Часть отрезка, формирующего ребро, заканчивается вершинами (vertex)  
## Графический конвейер
Необходимо: преобразовать трехмерные описания объектов в двухмерную картинку
Как: задать строгий порядок преобразований
**Конвейер** - это последовательность состояний, выполняющихся параллельно и в фиксированном порядке
**Графический конвейер** - это некоторое программно-аппаратное средство, которое преобразует описанные в виртуальном мире объекты в матрицу ячеек видеопамяти растрового дисплея
1. Определение состояния объектов
2. Определение соответствующих текущему состоянию геометрических моделей
3. Разбиение геометрических моделей на примитивы
4. Привязка текстур и освещения
5. Видовые геометрические преобразования
6. Отбрасывание невидимых примитивов
7. Установка примитивов
8. Закраска примитивов
9. Финальная обработка  

Некоторые стадии конвейера могут быть переставлены местами, разбиты на части или совмещены. Они могут отсутствовать вообще (редко) или могут появится новые (часто). Результат работы каждой из них может быть послан (в обход других стадий) обратно
## Как рисовать объекты с помощью 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();
```
Типы примитивов:
- gl_points - точки
- gl_lines - линии
- gl_line_strip
- gl_line_loop
- gl_triangles
- gl_triangle_strip
- gl_qead_stripe
- gl_poligon
- gl_quads
#### Атрибуты вершин
Каждая вершина кроме положения в пространстве может иметь несколько других атрибутов:
- Материал
- Цвет
- Нормаль
- Текстурные координаты  

Всегда используется **текущий** набор атрибутов
#### Преобразования координат в OpenGL
Каждая вершина объекта задается в локальных **координатах модели**  
Необходимо определить набор геометрических преобразований, таких, что каждая вершина преобразуется в точку на плоскости экрана
3 последовательных преобразования:
- модельное
- видовое
- проективное
