Процедурное текстурирование




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

Задача данного курсового проекта выбрать некоторый набор эффектов компьютерной графики из списка представленного в таблице 1 и реализовать их с помощью библиотек OpenGL.

Табл. 1. Список эффектов

Название эффекта Число баллов
Простые эффекты
Отбрасывание тени на плоскости  
Расчет освещенности и закраска по Гуро  
Системы частиц первого порядка  
Анимация объекта(-ов)  
Кубические текстуры в режиме окружающей среды (environmental maps)  
Туман  
Стандартные эффекты
Отбрасывание тени на другие объекты  
Зеркальные грани  
Процедурные текстуры (описываемые математическими формулами)  
Рельефное текстурирование (Bump mapping, Normal mapping)  
Антиалиасинг (сглаживание)  
Переменная глубина резкости  
Объекты “биллбоард” с полупрозрачностью (объекты, которые всегда повернуты к наблюдателю одной стороной)  
Сложные эффекты (Часть 1)
Программно-заданный объект нетривиальной формы (с дырками)  
Взаимное затененение, самозатенение  
Расчет освещенности и закраска по Фонгу  
Полупрозрачные объекты, требующие упорядоченного вывода граней  
Сплайновые поверхности. Сплайновый объект должен составлять существенную часть сцены  
Нетривиальные морфинг и анимация с изменением связности объектов  
Меташары  
Рендеринг объемных данных  
Слоистый туман  
Нестандартные модели освещения  
Сложные эффекты (Часть 2)
Полупрозрачные объекты с преломлением  
Моделирование движения и столкновения сложных объектов  
Объемные или протяженные источники освещения  
CSG  
Реалистичное моделирование дыма, облаков, поверхности воды  
Нечеткие тени  
Нечеткие отражения  
Фотонные карты (нелокальные модели освещения)  
Дополнительно
Передвижение наблюдателя в пространстве и изменение угла обзора (обработка клавишей мыши и клавиатуры)  
Музыкальное сопровождение сцены  

Для реализации мной были выбраны следующие эффекты:

· процедурное текстурирование;

· объекты «биллбоард» с полупрозрачностью;

· меташары;

· нетривиальный морфинг и анимация с изменением связности объектов.


 

Реализация выбранных эффектов

Процедурное текстурирование

Процедурные текстуры – это текстуры, описываемые математическими формулами. Такие текстуры не занимают в видеопамяти места, они создаются пиксельным шейдером сразу же, каждый их элемент получается в результате исполнения соответствующих команд шейдера. Наиболее часто встречающиеся процедурные текстуры: разные виды шума, дерево, вода, лава, дым, мрамор и огонь. То есть те, которые использовались анимированные текстуры при помощи всего лишь небольшой модификации математических формул [1].

Свойства процедурных текстур:

· обратимость. В процедурной текстуре сохраняется вся история её создания;

· малый размер;

· неограниченное количество вариаций при использовании стохастических алгоритмов;

· масштабируемость до любого размера;

· одновременно с итоговой текстурой очень легко получаются alpha-, bump-, reflect-карты.

Для реализации процедурных текстур в моём приложении был выбран алгоритм Перлина. Шум Перлина – математический алгоритм по генерированию процедурной текстуры псевдослучайным методом. Используется в компьютерной графике для увеличения реализма или графической сложности поверхности геометрических объектов. Также может использовался для генерации эффектов дыма, тумана и многих других эффектов.

Шум Перлина – это градиентный шум, состоящий из набора псевдослучайных единичных векторов, расположенных в определенных точках пространства и интерполированных функцией сглаживания между этими точками. Для генерации шума Перлина в одномерном пространстве необходимо для каждой точки этого пространства вычислить значение шумовой функции, используя направленные градиента в указанной точке.

Все визуальные детали текстуры имеют одинаковый размер. Это свойство делает шум Перлина легко управляемым. Множество масштабированных копий шума Перлина могут быть вставленными в математические выражения для создания самых разнообразных процедурных текстур.

Алгоритм можно масштабировать одно-, двух- и трёхмерного вида. Более того, можно дополнить алгоритм четвёртым временным измерением, которое позволяет динамически изменять текстуры во времени.

Шум Перлина был создан Куном Перлином в 1983 году [2]. Алгоритм широко используется в двухмерной и трёхмерной компьютерной графике для создания таких визуальных эффектов, как дым, облака, туман, огонь и т.д. Он также очень часто используется как простая текстура, покрывающая геометрическую модель.

Полупрозрачные объекты

Прозрачность позволяет использовать полупрозрачные объекты в сцене, что может значительно повысить реалистичность изображения.

В OpenGL прозрачность реализуется с помощью специального режима смешения цветов. Алгоритм смешения комбинирует цвета входящих пикселей с цветами соответствующих пикселей, уже хранящихся в буфере кадра.

Режим включается с помощью команды glEnable(GL_BLEND). Определить параметры смешения можно с помощью команды glBlendFunc(enum src, enum dst). Параметр определяет, как получить коэффициент исходного цвета пикселя, а вые определяет способ получения коэффициента для цвета в буфере кадра. Для получения результирующего цвета используется следующая формула: , где – цвет исходного пикселя, – цвет пикселя в буфере кадра. Все значения в формуле являются векторами [3].

В случае наличия в сцене нескольких прозрачных объектов, которые могут перекрывать друг друга, корректный вывод можно гарантировать только в случае выполнения следующих условий:

· все прозрачные объекты выводятся после непрозрачных;

· при выводе объекты с прозрачность должны быть упорядочены по уменьшению глубины, т.е. выводиться, начиная с наиболее отдаленных [4].

Меташары

Меташар – n-мерный объект в компьютерной графике, представляющий собой замкнутую сглаженную поверхность (рис. 1). Техника рендеринга меташаров была изобретена Джимом Блинном в начале 1980-х годов [5].

Рис. 1. Меташар

Использование полигонов в компьютерной графике часто дает не сглаженные модели, причем степень сглаженности сильно зависит от масштаба. Для получения гладких поверхностей используются различные, такие как B-сплайны и поверхности Безье. При использовании меташаров подразумевается, что в пространстве задано множество управляющих точек или частиц, обладающих потенциалом, и заданы функции зависимости потенциала от расстояния. Вычисляя потенциал поля, можно построить сглаженные изоповерхности довольно сложной формы.

Каждая управляющая точка определяет собственную n-мерную потенциальную функцию . Замет выбирается некое значение (потенциал), которое определяет форму меташара (фактически, определяется эквипотенциальная поверхность). Таким образом, неравенство определяет, находится ли точка внутри поверхности, заданной управляющими точками, или нет. Часто в качестве функции задающей меташар используют , где – цент меташара. Однако использование деления делает эту функцию неэффективной по скорости, поэтому обычно её заменяют аппроксимирующими полиномиальными функциями.

Желательно, чтобы функция потенциала удовлетворяла требованиям компактности носителя и гладкости.

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

Поскольку меташар является результатом суперпозиции полей управляющих точек, её гладкость зависит от гладкости функций потенциала.

Простейшая функция потенциала, удовлетворяющая этим критериям: , где – расстояние между управляющей точкой и заданной точкой пространства. Она также довольно эффективна, поскольку не использует деления и извлечения корня.

Более сложные модели используют для лучшего сглаживания гауссов потенциал, ограниченный конечным радиусом набора многочленов. Модель мягких объектов братьев Вивилл обеспечивает более высокую степень сглаженности и не использует квадратные корни.

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

Есть множество способ рендеринга меташаров. Для трехмерных меташаров чаще всего применяют рэйкастинг и алгоритм marching cubes.

Алгоритм шагающих кубов

Алгоритм шагающих кубов (marching cubes) – это алгоритм в компьютерной графике, впервые предложенный в 1987 году на конференции SIGGRAPH Вильямом Лоренсеном и Харви Клайном [6], для обработки полигональной сетки изоповерхности трехмерного скалярного поля.

Алгоритм пробегает скалярное поле, на каждой итерации просматривает 8 соседних позиций (вершины куба, параллельного осям координат) и определяет полигоны, необходимые для преставления части изоповерхности, проходящей через данный куб. Далее, на экран выводятся полигоны, образующие заданную изоповерхность.

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

Заранее вычисленный массив из 256 конфигураций полигонов можно получить поворотами и отражениями 15 различных конфигураций куба (рис. 2).

Рис. 2. 15 различных конфигураций куба

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

Данный алгоритм широко используется для трёхмерного моделирования меташаров или других метаповерхностей (рис. 3).

Рис. 3. Пример работы алгоритма на плоскости

Реализация эффектов

Для демонстрации реализации выбранных мной эффектов компьютерной графики была составлена сцена (рис. 4), содержащая три полупрозрачных меташара (рис. 5), которые образуют эффект нетривиалного морфинга и анимацию со связность объектов (рис. 6). Также была установлена на фон сцены процедурная текстура, созданная методом шума Перлина (рис. 7).

Рис. 4. Сцена программы

void InitMetaballs() { MetaBalls[0].radius = 0.3; MetaBalls[0].x = 0; MetaBalls[0].y = 0; MetaBalls[0].z = 0; MetaBalls[1].radius = 0.22; MetaBalls[1].x = 0; MetaBalls[1].y = 0; MetaBalls[1].z = 0; MetaBalls[2].radius = 0.25; MetaBalls[2].x = 0; MetaBalls[2].y = 0; MetaBalls[2].z = 0; }

Рис. 5. Программный код, демонстрирующий инициализацию метошаров

 

void MetaballsAnimation(){ glRotatef((GLfloat)ElapsedTime / 30, 0.0, 0.0, 1.0); GLfloat c = 0.15*cos(ElapsedTime / 600.0); MetaBalls[0].x = -0.3*cos(ElapsedTime / 700.0) - c; MetaBalls[0].y = 0.3*sin(ElapsedTime / 600.0) - c; MetaBalls[1].x = 0.4*sin(ElapsedTime / 400.0) + c; MetaBalls[1].y = 0.4*cos(ElapsedTime / 400.0) - c; MetaBalls[2].x = -0.4*cos(ElapsedTime / 400.0) –0.2*sin(ElapsedTime / 600.0); MetaBalls[2].y = 0.4*sin(ElapsedTime / 500.0) - 0.2*sin(ElapsedTime / 400.0); }

Рис. 6. Программный код, описывающий движения меташаров

int PerlinNoise_2D(float x, float y, float factor){ float total = cosf(sqrtf(2))*3.14f; float persistence = 0.5f; float frequency = 0.25f; float amplitude = 1.75; x += (factor); y += (factor); for (int i = 0; i < NumOctaves; i++){ total += CompileNoise(x*frequency, y*frequency) * amplitude; amplitude *= persistence; frequency *= 2; } total = fabsf(total); int res = int(total*255.0f); return res; }

Рис 7. Основная функция по созданию шума Перлина

Для реализации эффектов был выбран язык С++ и среда разработки Microsoft Visual Studio 2015.

ЗАКЛЮЧЕНИЕ

В рамках курсового проекта были реализованы следующие эффекты компьютерной графики:

· процедурное текстурирование;

· объекты «биллбоард» с полупрозрачностью;

· меташары;

· нетривиальный морфинг и анимация с изменением связности объектов.


 

СПИСОК ЛИТЕРАТУРЫ

1. Современная терминология 3D графики. [Электронный ресурс] URL: https://www.ixbt.com/video2/terms2k5.shtml#pt (дата обращения 15.02.17)

2. Kerman, Phillip. Macromedia Flash 8 @work: Projects and Techniques to Get the Job Done. Sams Publishing. 2006

3. Учебное пособие по OpenGL. [Электронный ресурс] URL: https://rsdn.org/article/opengl/ogltutor.xml#EXEAG (дата обращения 17.02.17)

4. Создание прозрачных объектов в OpenGL. [Электронный ресурс] URL: https://media.ls.urfu.ru/435/1147/2454 (дата обращения 19.02.17)

5. Intro to Metaballs. [Электронный ресурс] URL: https://steve.hollasch.net/cgindex/misc/metaballs.html (дата обращения 20.02.17)

6. William E. Lorensen, Harvey E. Cline: Marching Cubes: A high resolution 3D surface construction algorithm. In: Computer Graphics, Vol. 21, Nr. 4, July 1987



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-30 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: