Слайд 2Что такое OpenGL
OpenGL(Open Graphics Library) – это независящий от языка программирования и
платформы программный интерфейс для написание приложений, использующих 2D и 3D графику
Написанием спецификаций занимается Khronos Group
Используется для написания игр(Half-Life 1,2,3 о_0, Bioshock, Counter-Strike, …), специализированного ПО(Photoshop, Google Earth, Blender, …) , визуализации в научных исследованиях и т.д.
Слайд 3Реализации OpenGL
На данный момент существуют реализации практически для всех платформ
Для мобильных
платформ(iOs, Android) существует собственная спецификация OpenGL ES, учитывающая их аппаратные особенности
Большинство современных браузеров поддерживают WebGL - аналог OpenGL ES
Готовится спецификация Vulkan API для объединения OpenGL и OpenGL ES
Слайд 4Зачем нам OpenGL
OpenGL позволяет не обращать внимания на особенности аппаратуры и драйверов,
предоставляя единый API для разработчика
Если какая-то возможность не поддерживается аппаратурой/драйвером то OpenGL эмулирует её
Реализации OpenGL проходят специальные тесты на совместимость и эффективность использования оборудования
Слайд 5Архитектура OpenGL
Основной принцип работы: получение набора векторных графических примитивов(с математической обработкой) –
точек, линий и треугольников для построения растровой картинки на экране и/или в памяти
Векторные трансформации и растеризация выполняются графическим конвейером (graphics pipeline), который по сути представляет собой дискретный автомат
Почти все команды OpenGL делятся на 2 группы:
Добавление примитивов на вход в конвейер
Конфигурация конвейера для выполнения трансформаций
Императивный подход, т.е. Описание точной последовательности шагов для получения конечной растровой картинки
Слайд 6Основные положения
Растеризация - это перевод изображения, описанного векторным форматом в пиксели или
точки, для вывода на дисплей
Render – полный процесс отображения растровой картинки на экране
Render Frame(или просто Frame) – часть процесса рендера, отображающая картинку в конкретном состоянии в данный момент времени
Texture – изображение, загружаемое в память для использования в процессе рендера
Framebuffer – набор буфферов в памяти устройства, содержащий всю информацию о данном состоянии на экране
Render context - поток в котором происходит процессе рендера
Слайд 8OpenGL в QT
За работу с OpenGL в QT отвечает модуль QT OpenGL
Основные
классы для работы с OpenGL:
QGLWidget – виджет поддерживающий работу с OpenGL.
QGLFunctions – класс, содержащий все необходимые функции для работы с OpenGL
QGLShaderProgram – класс для работы с шейдерами
QGLTexture - класс для работы с текстурами
QVectror4D/3D/2D,QMatrix(4x4,3x3,2x2), QQuaternion и т.д. – классы для работы с математическими примитивами
Слайд 9QGLWidget
Виртуальная функция initializeGL() - функция для начальной инициализации OpenGL. Вызывается до начала
процесса рендера
Виртуальная функция resizeGL() – функция, вызываемая при изменение размера виджета
Виртуальная функция paintGL() – функция, в которой содержится последовательность действий для отображение фрейма
Слайд 10QGLFunctions - основные функции
glEnable/glDisable(feature) – включает/выключает поддержку определенного свойства контекста OpenGL
glClear(clear_bitfield) –
очищает указанные буфферы
glClearColor(r,g,b,a) – задает цвет в формате RGBA, который будет использоваться для в момент очистки буффера цвета
glVertex(2/3/4)(s/f/d/i)[v](…) - указывает координаты вершины в различных форматах
glBegin(mode) – указывает как использовать данные о вершинах, которые будут заданы после вызова данной функции. После задания всех нужных вершин вызывается glEnd().
glColor3f/4f[v](…) – указывает какого цвета будут вершины после вызова данной функции
Слайд 11QGLFunctions - основные функции
glMatrixMode(mode) - указывает, в какой стек положить матрицу преобразования,
загруженную после вызова этой функции
glLoadMatrixf – устанавливает матрицу в вершине стека(стек выбран с помощью glMatrixMode) матрицу
glPush(Pop)Matrix – добавляет(удаляет) матрицу в(из) выбранный стек матриц
glViewport(x,y,w,h) – указывает положение и размер окна для отрисовки контекста OpenGL
Слайд 14Немного о матрицах в 3D графике
Матрицы преобразования делятся на 3 типа: Model,
View, Projection
Model matrix – матрица преобразования координат из локальных в глобальные(World coordinates)
View matrix – матрица преобразования координат из глобальных в координаты взгляда(Camera)
Projection matrix – матрица преобразования координат из координат камеры в перспективные координаты(составляется по 4 параметрам: Горизонтального поле зрения – в градусах, соотношение сторон окна, расстояние до ближней и дальней плоскости перспективы(Ось z))
Конечная координата = Projection * View * Model * Vertex
Слайд 15Немного о матрицах в 3D графике
Model matrix
View matrix
Слайд 17Немного о матрицах в 3D графике
Наиболее используемый размер матриц – 4x4
Почему 4x4
?
Подматрица 3x3 называется нормальной матрицей
Слайд 21Рисуем куб
Куб с ребром длиной 1 и центром в точке (0,0,0)
Как нарисовать:
Разбить
все грани на 2 треугольника
Перечислить координаты всех треугольников в правильном порядке
Слайд 24Рисуем куб: Вариант 2 – Чуть умнее