Разработка приложения для визуализации трехмерных iен с использованием карт освещения и динамического освещения

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



анство глаза камеры. Следовательно, вначале нужно перейти во внешнюю систему координат, потом - в систему iентром в источнике света, а затем - в усеченное пространство источника света. Это преобразование можно обобщить следующей последовательностью матричных умножений.

(5)

Однако это еще не все. Усеченного пространства источника света недостаточно. Помните, что для всех координат (х, у и z) усеченное пространство ограничивается диапазоном [-1,1]. Текстуру глубины карты тени, подобно всем стандартным двухмерным текстурам, нужно индексировать в диапазоне [0,1]. Кроме того, глубины, с которыми нужно сравнивать значения, принадлежат диапазону [0,1], поэтому координату z также нужно перевести в этот диапазон Для этого следует выполнить масштабирование с коэффициентом одна вторая (S) и сместить результат на одну вторую (В).

(6)

Если вы не знакомы с матричной формой записи, принятой в OpenGL, у вас может возникнуть вопрос, почему эти матрицы идут в обратном порядке. Ведь вначале нужно применить матрицу, обратную к относящейся к камере матрице проекции модели, а матрица трансляция (или смещения) на одну вторую применяется последней. В чем дело? В действительности все очень просто. OpenGL действует матрицей (М) на координату (Т) в обратном порядке. Поэтому чтобы представлять порядок преобразований, применяющихся к координатам, следует читать выражения справа налево:

(7)

К сожалению, для большинства теневых текстур, созданных по технологии shadow mapping допускает алиасинг - резкие границы теней. Современные видео-карты имеют встроенные методы для понижения алиасинга на простых текстурах: а именно mipmapping и anisotropic filtering. Эти методы не подходят к стандартным теневым картам, так как они могут изменить глубину соседних пикселей, которая хранится в компоненте цвета текстуры.

Для вычисления теней в общих iенах и борьбы с алиасинг используется процентная Близкая Фильтрация (Percentage Closer Filtering, PCF) обеспечивает решение проблемы алиасинга карты теней. Ключевой момент в том, что корректный алгоритм фильтрации нуждается в выявление результатов срав-нения глубин, вместо их фильтрации. Это совершается выборочно семплированием карты теней, таким образом, требуя множество семплов для уничтожения помех.

Карты глубин хранит распределение глубин каждого пикселя вместо единой глубины. Как результат, PCF может быть сделан как препроцесс.

Однако, карта глубин не подлежит реализации на аппаратном уровне по двум причинам: каждый пиксель должен кодироваться как кусочно-линейная функция, используя большое количество данных, а кроме того, процедура усреднения двух распределений не нулевая.

Тусклость карты теней кодируется распределением глубин, используется фиксированное количество сохранённых пикселей. Каждый пиксель хранит функция в карте глубин, функция эта создаётся из фиксированного набора точек. Таким образом, алгоритм имеет преимущество в скорости.

Альтернативное решение проблемы алиасинга карты теней это изменение проекции карты теней. Этот подход рассматривается в adaptive shadow maps, perspective shadow maps, light space perspective shadow maps и trapezoidal shadow maps.

2.Проектирование 3D-приложения

Для проектирования 3D-приложения необходима библиотека классов, которая облегчает процесс разработки такого рода приложений. Такую библиотеку классов также часто называют 3D движком, Над разработкой 3D движка работают многие коммерческие фирмы с большим штатом программистов в течение длительного времени, но все эти 3D движки закрыты или являются очень дорогостоящими. В связи с тем, что мы не обладаем большими финансовыми и штатными резервами и также ограничены во времени, будем проектировать собственный 3D движок c минимальным достаточным набором функций.

2.1Постановка задачи

Цель данной работы - разработка 3D-приложения на основе библиотеки классов. Разработанная библиотека классов должна предоставлять пользова-телю следующий перечень возможностей:

выводить, управлять Windows - окнами

подключать / отключать графическую библиотеку, в нашем случае - OpenGL

обрабатывать действия пользователя, например нажатие клавиш и перемещение мыши

уметь манипулировать математикой основных 3d данных:

) вектора разной размерности (2,3,4 компонентные),

) матрицы (3,4 разрядные),

) кватернионы

) углы Эйлера, а также их взаимное преобразование, а именно переход из углов Эйлера в матрицу и наоборот

загружать / выгружать текстуры (файловые изображения)

уметь создавать базовые модели плоскость, куб, сфера, торус

уметь загружать / выгружать произвольные 3d-модели

загружать шейдеры

передавать данные в шейдер

задавать материалы к загруженным 3d-моделям

работа с внеэкранными буферами

D движок сложная структура и может быть представлена в виде, как показано на рис. 2.1. Причем заметим, что подсистемы расчета физики и подсистема воспроизведения звука не обязательны для нашего минимального 3D движка, поэтому мы их опустим, а подсистемы пользовательского ввода и подсистема вывода графики необходимы.

Рисунок 2.1 Общая схема 3D-движка

Модуль Камера предназначен для создания и управления камерой наблюдателя в нашем проектируемом 3d мире

Модуль Текстуры предназначен загрузки изображений и преобразований ее формат OpenGL. В нашей программе мы используем TGA формат для загрузки изображения, как один из наиболее распространенны