Онлайн поддержка
Все операторы заняты. Пожалуйста, оставьте свои контакты и ваш вопрос, мы с вами свяжемся!
ВАШЕ ИМЯ
ВАШ EMAIL
СООБЩЕНИЕ
* Пожалуйста, указывайте в сообщении номер вашего заказа (если есть)

Войти в мой кабинет
Регистрация
ГОТОВЫЕ РАБОТЫ / КУРСОВАЯ РАБОТА, ИНФОРМАТИКА

Построение реалистичных изображений с использованием glsl шейдеров для OPENGL.

irina_krut2020 396 руб. КУПИТЬ ЭТУ РАБОТУ
Страниц: 33 Заказ написания работы может стоить дешевле
Оригинальность: неизвестно После покупки вы можете повысить уникальность этой работы до 80-100% с помощью сервиса
Размещено: 07.05.2020
Объекты исследования: библиотека OpenGL, шейдеры, язык программирования GLSL, источники света, модели освещения, материал объекта, текстурирование, алгоритмы построения теней, сглаживание краев теней. Цель работы: требуется исследовать построение реалистичных изображений с использованием GLSL шейдеров OpenGL, а именно различные модели освещения, фактуры и теней, и реализация исследования в виде программного продукта на языке C++ в среде разработки Visual Studio. В ходе исследования, с помощью ООП были реализованы классы для работы с источниками света, материалом объекта, класс для построения геометрических объектов, функции для работы с текстурой, реализованы алгоритмы модели освещения Фонга, построения теней методом карты теней, сглаживание краев теней техникой PCF. А также, было проведено тестирование скорости отрисовки одного кадра. Ключевые слова: OpenGL, шейдер, шейдерная программа, модель освещения Фонга, материал объекта, текстура, источники света, точечный источник света, направленный источник света, прожектор, проективные тени, метод теневых объемов, карта теней, GLSL.
Введение

Компьютерная графика – это достаточно сложная, основательно проработанная дисциплина, предметом изучения которой является создание, хранение и обработка моделей и их изображений с помощью ЭВМ. 3D графика применяется во множестве различных областей: в науке, для наглядного изображения каких-то не до конца изученных процессов, в видеоиграх, которые давно не ограничиваются компьютерной платформой, в кинематографе для создания сложнейших спецэффектов, в медицине, строительстве, рекламе, и т.д. Имея качественную модель, можно увидеть объект, который не существует, посмотреть его со всех сторон, окунуться в виртуальный мир компьютерных игр, сидя дома перед экраном компьютера. Следуя правилам создания качественной 3D модели, можно добиться эффекта присутствия, эффекта реальности. То есть, такие объекты отличаются от других правдоподобностью. В наше время реалистичные 3D изображения являются пиком совершенства в игровой, рекламной, строительной индустрии. Моделирование 3D изображений это достаточно ресурсоемкая задача, ставящаяся перед современными вычислительными системами. И, несмотря на постоянное совершенствование техники, стремительное развитие технологий, требования к задачам остаются неизменно высокими, т.к. с ростом возможностей растут и требования. То есть, помимо оптимизации технической базы требуется оптимизация на уровне прикладного программирования. Одним из таких методов оптимизации является грамотное использование графической библиотеки OpenGL, а именно, программирование на шейдерах. Оно дает возможность переложить часть сложных вычислений, связанных с отрисовкой сцены, с центрального процессора на, специально предназначенный для этого, графический процессор, являющийся аппаратной частью видеокарты. Целью данной дипломной работы является построение реалистичного изображения трехмерных объектов с использованием библиотеки OpenGL и шейдеров.
Содержание

ВВЕДЕНИЕ 4 1. Библиотека OpenGL 5 1.1. Основные возможности OpenGL 5 1.2. Архитектура OpenGL 6 1.3. Синтаксис команд 7 1.4. Матричные преобразования 8 2. Шейдеры 13 2.1. Типы шейдеров 13 2.2. Язык программирования шейдеров 14 2.3. Программирование GLSL шейдеров 14 3. Реалистичное изображение 16 3.1. Источники света 16 3.2. Модель освещения 20 3.3. Материал Объекта 23 3.4.Реализация теней 24 3.4.1Сцена и источник освещения 29 3.4.2.Буфер глубины 29 3.4.3.Использование теневой карты 30 3.4.4.Сглаживание краев тени 31 ЗАКЛЮЧЕНИЕ 33 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 34
Список литературы

1. Графическая библиотека OpenGL. Учебно – методическое пособие [Электронный ресурс] / Ю.М. Баяковский, А.В. Игнатенко, А.И. Фролов – Факультет вычислительной математики и кибернетики МГУ им. Ломоносова 2003 – URL: https://rsdn.org/article/opengl/ogltut2.xml (Дата обращения: 24.10.17) 2. Шейдер [Электронный ресурс] – URL: https://ru.wikipedia.org/wiki?curid=107896 (Дата обращения: 25.11.17) 3. learnopengl. Урок 1.5 — Shaders [Электронный ресурс] – URL: https://habrahabr.ru/post/313380/ (Дата обращения: 25.11.17) 4. Введение в OpenGL [Электронный ресурс] – URL: http://www.codenet.ru/progr/opengl/3d.php (Дата обращения: 17.01.18) 5. Создание графических моделей с помощью Open Graphics Library / Лекция 6: Координатные преобразования в OpenGL [Электронный ресурс] – URL: https://www.intuit.ru/studies/courses/2313/613/lecture/13303 (Дата обращения: 21.01.18) 6. Компьютерная графика / теория, алгоритмы, примеры на С++ и OpenGL/ Источники света [Электронный ресурс] – URL: http://compgraphics.info/OpenGL/lighting/light_sources.php (Дата обращения: 19.02.18) 7. Learn OpenGL. Урок 2.5 — Источники света [Электронный ресурс] – URL: https://habrahabr.ru/post/337642/ (Дата обращения: 26.02.18) 8. Компьютерная графика / теория, алгоритмы, примеры на С++ и OpenGL/ Закон Ламберта. Модель отражения Фонга. Модель отражения Блинна – Фонга [Электронный ресурс] – URL: http://compgraphics.info/3D/lighting/phong_reflection_model.php (Дата обращения: 17.03.18) 9. Реализация теней с помощью библиотеки OpenGL / Журавлев С.В., Михайлюк М.В., Торгашев М.А. [Электронный ресурс] – URL: http://swsys.ru/print/article_print.php?id=863 (Дата обращения: 17.03.18) 10. Свойства материала [Электронный ресурс] – URL: http://metodpro.ru/index.php?type_page&katalog&id=999&met6 (Дата обращения: 21.03.18) 11. Программные продукты и системы / С.В. Журавлев, М.В. Михайлюк, М.А. Торгашев [Электронный ресурс] – URL: https://cyberleninka.ru/article/n/realizatsiya-teney-s-pomoschyu-biblioteki-opengl (Дата обращения: 5.04.18) 12. Обзор алгоритмов построения теней в реальном времени [Электронный ресурс] – URL: https://www.ixbt.com/video/realtimeshadows.shtml (Дата обращения:10.04.18)
Отрывок из работы

1. Библиотека OpenGL 1.1. Основные возможности OpenGL Библиотека OpenGL - это один из наиболее распространенных прикладных программных к графической аппаратуре для создания приложений в области 3D графики. В нее входит около 120 команд, которые может применять разработчик для задания объектов и операций, необходимых для написания интерактивного графического приложения. Главными особенностями OpenGL являются: Стабильность – все нововведения создаются таким образом, чтобы они были совместимы с предыдущим обеспечением. Кроссплатформенность – независимо от используемой операционной системы, визуальный результат будет везде одинаковый. Интуитивно понятный интерфейс и продуманная структура, что обеспечивает легкость применения. Библиотека OpenGL была разработана как единый независимый программный интерфейс для работы с графикой, который может быть реализован на любой платформе. Поэтому в ней нет функций создания окна, обработки пользовательского ввода, для этого нужно использовать средства вашей операционной системы. Также в ней нет методов для создания трехмерных объектов, они строятся разбиением моделей на ряд геометрических примитивов – точек, линий, полигонов. Базисные функции OpenGL можно выделить в следующие группы: 1. Функции – формируют модели из геометрических примитивов, создавая, таким образом, математическое описание объекта. 2. Функции источников – позволяют описать свойства источника света и его положение в пространстве. 3. Функции атрибутов – с помощью атрибутов задается цвет, параметры фактуры, текстура, характеристики освещения. 4. Функции – позиционируют в трехмерном пространстве и задают 5. Функции - преобразуют математическое описание модели в пиксели на экране, что называется растеризацией. 1.2. Архитектура OpenGL OpenGL включает в себя ряд библиотек. Все основные функции находятся в основной библиотеке. Основная библиотека позволяет обрабатывать и рисовать графические примитивы в буфере кадра. Каждый – это точка, отрезок, и т.д. Примитивы задаются массивом вершин Для каждой вершины определены некоторые атрибуты: координаты и другие. OpenGL, с точки зрения представляет собой конвейер, состоящий из некоторых этапов обработки. Все команды выполняются в порядке поступления. А с точки зрения разработчиков, это управляющих графической аппаратурой. Рисунок 1 - Функционирование конвейера OpenGL Подавляющее большинство команд OpenGL разделяются на следующие группы: или они добавляют на вход в конвейер, или настраивают его на выполнение различных трансформаций. Основная задача конвейера OpenGL – это процесс (rasterization) и (rendering). Рендеринг – это процесс, в котором о трехмерных объектов преобразуются в которую видит пользователь. Растеризация – это определенный который применяется в ходе рендеринга. 1.3. Синтаксис команд Определения команд находятся в файле библиотеки, которую нужно подключить: Аналогично нужно подключить остальные библиотеки OpenGL, которые вы хотите использовать. Все команды библиотеки начинаются с префикса все константы - с префикса Для остальных библиотек: Также, в имена команд входят суффиксы, несущие информацию о числе и типе передаваемых значений. Где: - имя библиотеки, в которой находится данная команда – имя команды – количество аргументов команды – тип аргумента –означает, что в качестве параметра передается указатель на массив. Символы в квадратных скобках в некоторых названиях могут не использоваться. 1.4. Матричные преобразования Любая сцена, которую мы захотим визуализировать с помощью компьютерной графики, может быть представлена набором вершин, которые задаются при помощи координат в трехмерном пространстве. Это виртуальное пространство задается с помощью точки начала отсчета координат (0, 0, 0) и трех ортогональных единичных векторов, исходящих из этой точки. В используются три основные системы координат: правосторонняя (мировая), левосторонняя ( ) и Первые две являются и отличаются . является системой координат, в которую преобразуются координаты из трехмерной, для вывода изображения на экран. Рисунок 2 – системы координат То есть, главная задача, которую нужно решить, заключается в изображении объектов, описанных в мировой системе координат, на плоскости экрана. Для этого нужно выполнить определенную последовательность преобразований. Задача, которая решается в процессе рендеринга - получить плоское двумерное изображение, в котором сохранится На самом деле, вся трехмерная компьютерная графика - это качественный зрения, цель которого вызвать у зрителя иллюзию объема наблюдаемого изображения, которое представляет собой двумерный закрашенных в определенный цвет. Конечная задача всех математических преобразований – вычислить цвет каждого пикселя. Для отображения трехмерных объектов сцены на экране используется следующая Рисунок 3 – цепочка преобразований На этапе модельно-видовых преобразований выполняется переход от мировой системы координат к системе координат камеры. Камера – это точка наблюдения за объектами сцены. К модельно – видовым преобразованиям относятся: перенос, поворот и масштабирование. Для выполнения любой из этих операций, каждую вершину нужно умножить на соответствующую матрицу. В итоге получим новые координаты этой вершины: (1) где M – видовая матрица преобразования. Видовая матрица – это произведение матрицы поворота и матрицы переноса. Сама матрица может быть создана с помощью следующих команд: производит перенос объекта, прибавляя к координатам его вершин значения своих параметров. Матрица сдвига вдоль осей x, y и z: производит поворот объекта против часовой стрелки на угол (измеряется в градусах) вокруг вектора (x,y,z). Матрица поворота вокруг произвольной оси (x, y, z) на угол ?: производит масштабирование объекта (сжатие или растяжение) вдоль вектора (x,y,z), умножая соответствующие координаты его вершин на значения своих параметров. Матрица масштабирования выглядит следующим образом: Главной задачей этапа проекции является проецирование изображения таким образом, чтобы сохранилась иллюзия трехмерности. В OpenGL существуют стандартные команды для задания ортографической (параллельной) и перспективной проекций. Первый тип проекции может быть задан командами: Рисунок 4 - Ортографическая проекция Матрица ортографической проекции: f – дальняя соответственно) Перспективная проекция определяется командой: которая задает усеченный конус видимости в левосторонней системе координат. Рисунок 5 - Перспективная проекция Матрица перспективной проекции: Последнее преобразование вершин перед выводом на экран заключается в умножении на матрицу порта просмотра (Преобразование к области вывода). После применения матрицы проекций, на вход следующего преобразования подаются так называемые усеченные координаты. Затем, находятся нормализованные координаты вершин по формуле: (2) Область вывода представляет собой прямоугольник в оконной системе координат, его размеры задаются командой: Значения всех параметров задаются в пикселях и определяют ширину и высоту области вывода с координатами левого нижнего угла (x,y) в оконной системе координат. Размеры оконной системы координат определяются текущими размерами окна приложения, точка (0,0) находится в левом нижнем углу окна. Используя параметры команды OpenGL вычисляет оконные координаты центра области вывода (ox,oy) по формулам: , . (3) Матрица перевода координат в оконную систему координат: В данном случае и – это ширина и высота области вывода в пикселях, а и – координаты левого нижнего угла этой области на экране. 2. Шейдеры Вместе с выходом версии OpenGL 3.0 стала доступна шейдерная программа, именно она лежит в основе решения задач реализации реалистичного 3D изображения. Шейдерная программа - это небольшая программа, состоящая из программных модулей, шейдеров. Отличительной особенностью шейдеров является то, что они выполняются на аппаратном уровне оборудования, используя видеопамять и графический процессор (GPU). Программа заменяет часть графического конвейера видеокарты, без ее использования мы не получим даже самую простую картинку на экране. В графических приложениях, шейдеры используются для определения параметров геометрических объектов или изображения, и для их изменения (для создания эффектов сдвига, отражения, преломления, затемнения с учётом заданных параметров поглощения и рассеяния света, для наложения текстур на геометрические объекты и др. 2.1. Типы шейдеров Шейдеры делятся на три типа: 1. Вершинный шейдер Заменяет часть графического конвейера, выполняющего преобразования, связанные с данными вершин геометрических примитивов. Например, умножение вершин и нормалей на матрицу проекции и моделирования, установка цветов вершин, установка материалов освещения. Он работает для каждой отрисованной вершины. Обязательной работой для вершинного шейдера является запись позиции вершины, во встроенную переменную . 2. Фрагментный или пиксельный шейдер Обрабатывает каждый полученный на предыдущих стадиях фрагмент, а именно, данные, связанные с пикселями. Например, получение данных из текстуры, просчет освещения, просчет смешивания. Пиксельный шейдер используется на последней стадии графического конвейера для формирования фрагмента изображения. Обязательной работой для фрагментного шейдера является запись цвета фрагмента во встроенную переменную или его отбрасывания специальной командой . 3. Геометрический шейдер ; В отличие от вершинного, геометрический шейдер обрабатывает не одну вершину, а целый геометрический примитив. Такой тип шейдера используется редко. 2.2. Язык программирования шейдеров Шейдеры для OpenGL пишутся на специальном языке GLSL. Шейдером называется независимо компилируемая единица, написанная на этом языке. GLSL – шейдеры принято хранить в виде исходных кодов. Исходные коды компилируются драйвером лишь после создания действующего контекста OpenGL. Шейдерная программа – это набор скомпилированных шейдеров, связанных вместе. GLSL (OpenGL Shading Language) — язык высокого уровня для программирования шейдеров. Синтаксис языка базируется на языке программирования ANSI C, однако, из него были убраны многие возможности, для его упрощения. Но и добавлены специальные функции и типы данных, например, для работы с векторами и матрицами. 2.3. Программирование GLSL шейдеров В GLSL можно объявлять структуры, переменные, функции, но на него наложены некоторые ограничения. Например, запрещена рекурсия . Также, доступны специальные типы переменных для работы с векторами и матрицами. Описание шейдера начинается с указания его версии, далее следуют списки входных и выходных переменных, глобальных переменных (ключевое слово uniform), функции main. Функция main являетсяточкой входа шейдера. Внутри этой функции можно производить манипуляции с входными данными, результат работы шейдера помещается в выходные переменные. Существуют специальные ключевые слова, обозначающие тип доступа к переменным, которые необходимо указывать при объявлении переменных: входные переменные обозначаются как in, еще их называют вершинными атрибутами, а выходные переменные как out, юниформы обозначаются как uniform. Входные переменные определяют эффективность вершинного шейдера, уникальность которого заключается в том, что он принимает значения напрямую из вершинных данных. Это нужно для того, чтобы мы могли настраивать вершинные данные через CPU. Юниформы – это специальный тип переменных, предназначенный для связи с нашего приложения, работающего на CPU с шейдером, работающим на GPU. Юниформа является глобальной переменной. Она является уникальной для каждого шейдера и будет сохранять свое значение до тех пор, пока оно не будет обновлено или сброшено. Выходные атрибуты предназначены для передачи данных из шейдера на следующий этап обработки данных, например, из вершинного шейдера во фрагментный. Обобщенная структура шейдера выглядит следующим образом: GLSL, как и любой другой язык программирования представляет разные типы данных, к ним относятся int, float, double, uint, bool. А также, контейнеры vector и matrix. — это контейнер, содержащий до 4 значений любого примитивного типа. Например: Для доступа к компонентам вектора можно воспользоваться двумя способами: – обращение по индексу; – обращение к полям структуры (x, y, z, w или r, g, b, a или s, t, p, q). – контейнер для работы с матрицами. При работе с таким типом данных, данное всегда рассматривается как математическая матрица. То есть, при перемножении матрицы и вектора получаются правильные с математической точки зрения результаты. Также, OpenGL предоставляет некоторый абстрактный “черный ящик” для доступа к текстуре – дискретизатор или сэмплер ( – предоставляет доступ к двухмерной текстуре). При инициализации сэмплера, OpenGL записывает в него все необходимые данные. Шейдер не может его модифицировать, он может только получить его через uniform-переменную и использовать в функциях для доступа к текстурам. 3. Реалистичное изображение Для создания реалистичных изображений необходимо определить как свойства самого объекта, так и свойства внешней среды. Первая группа включает в себя характеристики материала, из которого сделан объект, а также текстура. Ко второй группе относятся количество и свойства источников света, модель освещения и отрисовка теней. Чтобы можно было нарисовать какие-либо модели и работать с их свойствами, создан класс Mesh, который содержит в себе функции построения различных геометрических фигур: плоскость, сфера, куб, тор, функции рендера и удаления этих фигур. Функции построения моделей выполняют загрузку внешнего файла в котором находится массив вершин и массив индексов, которые определяют номера вершин в вершинном буфере, использующихся при выводе изображения на экран, после чего все данные о вершинах и связях сохраняются в VAO и VBO. Vertex Buffer Object (VBO) — это такое средство OpenGL, позволяющее загружать определенные данные в память GPU, сюда мы помещаем массив вершин. Vertex Arrays Object (VAO) — с помощью него, OpenGL понимает, какую часть VBO следует использовать в последующих командах, здесь будет находиться массив индексов. 3.1. Источники света В компьютерной графике чаще всего работают с тремя типами источников света: • Точечный источник света (point light); • Направленный источник света (directional light); • Прожектор (spot light); 1.Точечный источник света расположен в некоторой точке пространства и излучает во всех направлениях, а его интенсивность обратно пропорциональна его расстоянию до объекта. Уменьшение интенсивности освещения при увеличении расстояния называется затуханием. Самый простой способ расчета затухания – это линейный закон. Но такой способ дает не очень хорошие результаты, вблизи источника света, объект будет засвечен, а потом, на небольшом радиусе, интенсивность резко спадет. Поэтому существует специальное выражение для расчета коэффициента затухания: (4) Где d – расстояние от фрагмента до источника, – постоянный коэффициент. Равен 1, для того, чтобы избежать уменьшения знаменателя до величин, меньше единицы, что привело бы к росту интенсивности на некоторых расстояниях. – линейный коэффициент. Определяет член, линейно уменьшающий интенсивность света с увеличением расстояния. – квадратичный коэффициент. Определяет член, определяющий квадратичный спад интенсивности. На маленьких расстояниях вклад квадратичного члена будет перекрыт вкладом линейного, но с ростом расстояния станет главным в выражении. Рисунок 6 – иллюстрация освещения точечным источником Примером точечного источника света в реальной жизни является лампа накаливания. Рисунок 7 2.Направленный источник света находится в бесконечности, и свет распространяет в заданном направлении. Если источник света находится достаточно далеко, то все его приходящие лучи будут параллельны друг другу. Поэтому и расчет освещения для всех объектов будет одинаковым. Такой свет идеально подходит для равномерного освещения. Рисунок 8 Хорошей аналогией направленного источника света является солнце. Хоть оно и не бесконечно удалено от нас, этого расстояния достаточно, чтобы считать его таковым при расчетах. Рисунок 9 – направленный источник света 3.Прожектор – одна из разновидностей точечного источника света. Прожектор ограничивает распространение света конусом. Объекты освещаются лишь в небольшой окрестности от направления света, а те, который находятся за пределами данной области, остаются вовсе без освещения. Рисунок 10 Как пример можно представить ручной фонарик. Рисунок 11 - прожектор Здесь – вектор, направленный от фрагмента к источнику, – вектор направления прожектора, ? – угол отсечения, определяющий радиус подсветки (фрагменты, лежащие вне этого угла не будут подсвечены), ? – угол между векторами и (если ? меньше чем ?, то фрагмент попадает в зону подсветки). То есть нам всего лишь нужно посчитать скалярное произведение векторов и и сравнить полученное значение с заданным углом отсечения (с косинусом угла, ведь скалярное умножение возвращает косинус угла между двумя нормализованным векторами). Свет настраивается в исходном коде программы, однако, его свойства используются при расчете освещения в шейдерной программе. Для работы с источниками света и упрощения передачи данных в шейдерную программу создан класс Light, который определяет позицию в пространстве, направление и свойства источника света. В реализации данной дипломной работы используется направленный источник света, который, с учетом написанного интерфейса, настраивается следующим образом: Так выглядит сцена с нарисованными геометрическими фигурами (Mesh) и включенным и настроенным источником света (Light): Рисунок 12 – действие источника света 3.2. Модель освещения В любом трехмерном изображении использование какой-либо модели освещения придает реалистичность. Любая модель освещения включает в себя закон, по которому рассчитывается освещенность точки в пространстве и метод закраски многоугольника. Закраска методом Фонга не требует больших вычислительных затрат, однако позволяет решить многие проблемы других методов. Суть метода Фонга заключается в определении нормали к поверхности в каждой вершине полигона и дальнейшей интерполяции вектора по всему полигону. Далее необходимо вычислить значение яркости для каждого пикселя, основываясь на значениях вектора нормали. При этом достигается лучшая аппроксимация кривизны поверхности и, следовательно, получается более реалистичное изображение.
Условия покупки ?
Не смогли найти подходящую работу?
Вы можете заказать учебную работу от 100 рублей у наших авторов.
Оформите заказ и авторы начнут откликаться уже через 5 мин!
Похожие работы
Курсовая работа, Информатика, 16 страниц
350 руб.
Курсовая работа, Информатика, 30 страниц
400 руб.
Курсовая работа, Информатика, 113 страниц
790 руб.
Курсовая работа, Информатика, 82 страницы
690 руб.
Курсовая работа, Информатика, 23 страницы
500 руб.
Служба поддержки сервиса
+7 (499) 346-70-XX
Принимаем к оплате
Способы оплаты
© «Препод24»

Все права защищены

Разработка движка сайта

/slider/1.jpg /slider/2.jpg /slider/3.jpg /slider/4.jpg /slider/5.jpg