- •Предисловие
- •Лабораторная работа № 1. Знакомство с OpenGl с использованием кроссплатформенной библиотеки sdl
- •Теоретические сведения
- •Двумерная и трехмерная графика с помощью OpenGl
- •Подключение и инициализация OpenGl.
- •Расширенная работа с OpenGl-контекстом
- •Постановка задачи
- •Контрольные вопросы
- •Лабораторная работа № 2. Примитивы OpenGl, построение двумерных объектов, язык шейдеров.
- •Теоретические сведения
- •Линии: одиночные, ломаные, замкнутые ломаные.
- •Вывод примитивов на экран
- •Задание к лабораторной работе
- •Дополнительное задание
- •Лабораторная работа № 3. Аффинные преобразования. Трехмерные построения. Параллельная и перспективная проекции. Квадрик-объекты.
- •Лабораторная работа № 4. Камера. Освещение. Текстуры.
- •Контрольные вопросы.
- •Лабораторная работа № 5. Загрузка готовых моделей. Геометрические шейдеры. Анимация.
- •Библиографический список.
- •Оглавление
Постановка задачи
Написать программу, реализующую поддержку OpenGL-контекста в соответствии с выбранным уровнем сложности: низкий – контекст, создаваемый по умолчанию, средний – контекст определенной версии в режиме Core Profile, повышенный – процесс динамической загрузки функций "расширений" вынести в отдельную статическую или динамическую библиотеку, загрузку библиотеки OpenGL производить с помощью функции SDL_GL_LoadLibrary. Выход из программы осуществлять при нажатии сочетания клавиш "Ctrl + Q".
Контрольные вопросы
Что такое разрешающая способность экрана?
Какие основные фрагменты должна содержать минимальная программа OpenGL?
Что входит в понятие формат пикселя?
Какие библиотечные файлы должны быть подключены к программе для работы с OpenGL?
Какая цветовая модель используется при определении цвета в данной программе? Какие параметры следует указать, чтобы цвет фона был фиолетовый?
Функция SDL_GL_GetProcAddress, для чего служит и где применяется?
Как вычислить координату центра экрана?
В какой секции кода можно записывать команды рисования сцены?
Функция SDL_GL_LoadLibrary, для чего служит и где применяется?
Что необходимо произвести для инициализации OpenGL в режиме Core Profile? Для чего предназначен данный режим?
Какие существуют атрибуты типа SDL_GLattr, для чего они служат?
Лабораторная работа № 2. Примитивы OpenGl, построение двумерных объектов, язык шейдеров.
Цель работы – научиться выводить средствами OpenGL двумерные объекты на экран. Познакомиться со специализированным языком шейдеров OpenGL. Изучить различные способы закрашивания объектов.
Теоретические сведения
OpenGL обрабатывает и рисует в буфере кадра графические примитивы с учетом некоторого числа выбранных режимов. Каждый примитив – это точка, линия, многоугольник и так далее. Примитивы определяются набором из одной или более вершин. Рассмотрим каждый из примитивов по отдельности:
Точки.
Точки представляют собой одиночные вершины. Если точка должна быть изображена на плоскости, то для определения её положения необходимы две координаты. В этом случае используется вектор с двумя аргументами, например: Vector2f(0, 0). Буква f в названии вектора определяет тип аргументов – вещественные числа (float). Следовательно, если точка должна быть изображена в трехмерном пространстве, то для определения её положения необходимы три координаты. В этом случае используется вектор с тремя аргументами, например: Vector3f(0.5, 0.3,-0.7).
Константой для рисования точек является: GL_POINTS.
Линии: одиночные, ломаные, замкнутые ломаные.
Одиночная линия определяется двумя вершинами. Если требуется нарисовать несколько одиночных линий, то должны быть описаны координаты пар вершин, то есть количество вершин должно быть четным. В случае, если количество вершин нечетно – последняя вершина игнорируется.
Для рисования ломаных линий используется константа: GL_LINE_STRIP. При этом вершины интерпретируются следующим образом: конечная точка первой линии является начальной точкой следующего звена ломаной и так далее. Количество вершин может быть как четным, так и нечетным.
Для рисования замкнутой ломаной используется константа GL_LINE_LOOP. Последний отрезок замкнутой ломаной в качестве начала имеет последнюю вершину списка, а в качестве конца – первую вершину.
Треугольники: одиночные, лента, веер.
Для рисования треугольников используется константа GL_TRIANGLES. При этом, количество вершин должно быть кратно трем. Каждые три вершины определяют треугольник.
Лента треугольников используется, если изображение может быть построено с помощью нескольких треугольников, имеющих смежные стороны (рис. 1).
Рисунок 1 – Лента треугольников.
Здесь сторона v2v3 является общей стороной для первого и второго треугольников, сторона v3v4 – общей стороной второго и третьего треугольников и так далее. Если такую фигуру описывать с помощью одиночных треугольников, то необходимо задавать координаты всех вершин всех треугольников: v1, v2, v3, v2, v3, v4, v3, v4, v5, v4, v5, v6 – всего 12 вершин. Использование ленты треугольников позволяет не дублировать вершины при описании их координат. Изображенная на рисунке фигура может быть представлена лентой треугольников, координаты вершин перечисляются в следующем порядке: v1, v2, v3, v4, v5, v6 – достаточно 6 вершин.
Константа для примитива "лента треугольников": GL_TRIANGLE_STRIP.
Другая возможность рисования с помощью треугольников – использование "веера треугольников" в тех случаях, когда несколько треугольников имеют общую вершину (рис. 2). При описании вершин первой в списке должна стоять общая вершина. То есть в списке из нескольких вершин первые три вершины определяют первый треугольник; первая, третья и четвертая – второй; первая, четвертая и пятая – третий; и так далее. Если в списке имеется N вершин, то будет изображено N-2 треугольника.
Константа для примитива "веер треугольников": GL_TRIANGLE_FAN.
Рисунок 2 – Веер треугольников.
