Вы не авторизованы.

Fragmentarium-Distance Estimated часть 1

В данном руководстве описаны основные принципы работы трассировки лучей и создания фракталов в программе Fragmentarium.

 Оригинальный текст взят отсюда, который подготовил человек, собственно и занимающийся разработкой данной программы.  

В течение последних лет, направление 3D - фракталов претерпело небольшую революцию: открытие Mandelbulb (2009), Mandelbox (2010), калейдоскопической IFS (в 2010 году), и множество столь же или даже более интересных гибридных систем, таких как Spudsville (2010) или клейновых систем (2011). Все эти системы стали возможны для осуществления с помощью метода, известного как оценка расстояния (Distance Estimated) или DE.

Первый документ с введением Приблизительного расстояния 3D-фракталов был написан Хартом и другими в 1989 году: «Трассировка лучей детерминированных 3-D фракталов». В этой статье описывается, как оценка расстояния может быть использована для визуализации 3D фрактала кватернионного Жюлиа.

Raymarching как метод трассировки лучей

Классический способ трассировки лучей разбивает один (или более) луч на пиксели и вычисляет, где лучи пересекаются в геометрии сцены. Обычно геометрией описан набор примитивов, таких как треугольники или сферы, и какого-то количества пространственной структуры для ускорения определения, какие примитивы пересекаются лучами. Оценка расстояния, с другой стороны, это метод марша луча. Вместо вычисления точного пересечения между лучом камеры и геометрии, вы продолжаете движение небольшими шагами вдоль луча и проверяете, насколько вы близко находитесь к объекту. Когда вы ближе, чем определенный порог, вы останавливаетесь. Для того чтобы сделать это, вы должны иметь функцию, которая говорит вам, насколько вы близки к объекту: оценщик расстояния (Distance Estimator). Значение данного оценщика расстояния расстояния расскажет вам, какой величины шагом вы имеете право идти вдоль луча в пределах этого радиуса.

схематическое определение действия оценщика расстояния

Приведенный ниже код показывает, как происходит raymarch-система с оценкой расстояния:

float trace(vec3 from, vec3 direction) {
                float totalDistance = 0.0;
                int steps;
                for (steps=0; steps < MaximumRaySteps; steps++) {
                               vec3 p = from + totalDistance * direction;
                               float distance = DistanceEstimator(p);
                               totalDistance += distance;
                               if (distance < MinimumDistance) break;
                }
                return 1.0-float(steps)/float(MaxRaySteps);
}

 Здесь лишь марш луча в соответствии с оценкой расстояния и возврата значений оттенков серого на основе количества шагов до попадания. Это даст такие изображения (автор использовал для оценки расстояния Mandelbulb):

Интересно то, что, хотя мы и не указали никакой окраски или освещения модели, раскраска по количеству шагов подчеркивает деталь 3D структуры - на самом деле, это простой и очень дешевый (в использовании) вид Ambient Occlusion, мягкого освещения, которое часто используется в 3D визуализации.

Распараллеливание

Другим интересным наблюдением является то, что эти raymarchers тривиально параллельны, так как каждый пиксель может быть вычислен независимо и нет необходимости доступа комплекса общей структуры памяти, такой ка как ускорение структуры, используемой в классической трассировке лучей. Это означает, что системы такого рода являются идеальными кандидатами для реализации на GPU. Фактически, вопрос лишь в том, что большинство GPU по-прежнему поддерживает только одинарную точность чисел с плавающей точкой, что приводит к нумерическим неточностям быстрее, чем для CPU. Тем не менее, новое поколение поддерживает графические процессоров двойной точности, а некоторые API (такие, как OpenCL и Pixel Bender) неоднородны, то есть тот же код может быть выполнен на обоих центральных и графических процессорах - что делает его возможным для создания интерактивных превью на GPU и визуализации окончательного изображения с двойной точностью на ЦП.

До сих пор мы не говорили о том, как мы получаем эти оценщики расстояния, и это отнюдь не очевидно, что такие функции должны существовать вообще. Но можно интуитивно понять их, отметив, что такие системы, как и Mandelbulb и Mandelbox являются выходными по времени фракталами: мы перебираем функции для каждой точки в пространстве, и следуем орбите, чтобы увидеть расходится ли последовательность точек при максимальном числе итераций, или последовательность остается внутри фиксированного радиуса выхода. Теперь, сравнивая выход по времени длины (R), к его пространственной производной (DR) , мы могли бы получить оценку того, как далеко мы можем двигаться вдоль луча до времени выхода длиной ниже радиуса выхода, то есть:

DE = R- EscapeRadius

                      dr

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

Свет и тени

Так как мы визуализировали с помощью raymarching наши объекты, мы можем использовать стандартные методы освещения от трассировки лучей. Наиболее распространенной формой освещения является использование что-то вроде Blinn–Phong - шейдинговой модели, использующей OpenGL и Direct3D, для приближенного вычисления окружающего, рассеянного и зеркального света на основе положения источника света и нормалью фрактального объекта.

Нормаль поверхности

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

vec3 n = normalize(vec3(DE(pos+xDir)-DE(pos-xDir),

                                               DE(pos+yDir)-DE(pos-yDir),

                                               DE(pos+zDir)-DE(pos-zDir)));

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

 Ambient Occlusion

 Кроме окружающего, рассеянного и зеркального света от Blinn–Phong - шейдинговой модели, есть одна вещь, которая действительно улучшает иллюзию качества и глубины 3D-модель - окружающая окклюзия (ambient occlusion) или AO. Этот подход «лучевого шага АО ' имеет свои недостатки, хотя: например, если луч из камеры, почти параллелен поверхности (скользящее падение) будут использованы много шагов, а поверхность померкнет, даже если это не окклюзия вообще. Другой подход заключается в отборе проб оценщика расстояния в точках вдоль нормали к поверхности и использование этой информации, чтобы собрать меру для Ambient Occlusion. Это более интуитивный метод, но у него есть и некоторые другие недостатки. Описание этого подхода «сэмплинг АО» можно найти во введении Иньиго Quilez на поле расстояния рендеринга. В Fragmentarium реализованы оба метода: Параметр ' DetailAO ' управляет расстоянием, на котором нормали отбирают для метода «АО сэмплинга» (normal sampling AO). Если ' DetailAO ' устанавливается равным нулю, используется метод «ray step AO».

 Другие световые эффекты

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

Glow – можно добавить, просто путем смешивания цветов в зависимости от предпринятого количества шагов лучей (точки, близкие к фракталу будут использовать больше шагов лучей, даже если им не хватает фрактал, так пиксели расположенные близко к объекту будут светиться).

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

Жесткие тени - Убедитесь, что поглощается луч от точки поверхности к источнику света.

Мягкие тени.

Отражения в значительной степени то же самое - отражают луч из камеры нормали к поверхности. Многочисленные другие расширения могут быть добавлены в Raytracer: например, картографирования (environment mapping) окружающей среды с использованием HDRI панорамных карт обеспечивает очень естественное освещение и легко применимо для пользователя, имитация DOF (глубины поля зрения) также добавляет иллюзию глубины изображения, и может быть рассчитана в разумные сроки с качеством при использовании буфера экранного пространства.

Окраска

Фрактальные объекты с равномерным цветом базы и простыми цветными источниками света могут производить отличные изображения. Но алгоритмическая окраска является мощным инструментом. Алгоритмические цвета используют одну или несколько величин, определяющих на орбитой или выходом точки или времени. Ловушки орбиты (Orbit traps ) является популярным способом окраски фракталов. Этот метод отслеживает, как близко орбита доходит до выбранной геометрического объекта. Типичные ловушки включают отслеживание минимального расстояния до центра системы координат, или простых геометрических фигур, таких как плоскости, линии или сферы. В Fragmentarium многие системы используют 4 компонента вектора отслеживающих минимальное расстояние до трех х = 0, у = 0 и z = 0 плоскостей и расстояния от Origo. Они отображаются на цвете через X, Y , Z, R параметры во вкладке «Окраска».

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

 float smooth =  float(iteration)

 + log(log(EscapeRadiusSquared))/log(Scale)

 - log(log(dot(z,z)))/log(Scale);

Здесь iteration является числом итераций, а точки (z, z) является квадратом длины времени выхода (escape time length). Во-первых, формула включает характерный масштаб, ссылаясь на масштабный коэффициент в задаче (например, 2 для стандартного Мандельброта, 3 - для Menger). Не всегда можно получить такое количество (например, для Mandelboxes или гибридных систем). Во-вторых, если сглаживание цикла используется для просмотра цвета в палитре, смещение может быть проигнорировано, это означает, что вторая часть выражения может быть пропущена.

 здесь в нижней половине изображения использовалось сглаживание (smooth iteration count)

Улучшение качества

Некоторые визуальные эффекты и красители, основаны на целых количествах - например свечения основано и зависит от числа шагов лучей. Это приведет к видимым границам между дискретными шагами. Сглаживание цикла является одним из способов, чтобы избавиться от полос, но это в целом не применимо. Более общий подход заключается в добавлении какого-то шума в системе. Например, путем масштабирования длины шага первого луча для каждого пиксела на случайное число, при этом полосы исчезают - за счет введения некоторых шумов. Другим важным вопросом являются помехи: если только один луч прослеживается на пикселе, изображение склонно к сглаживанию и артефактам. Использование более одного образца удаляет сглаживание и снижает уровень шума. Есть много способов дополнительной выборки изображение - различные стратегии существуют для выбора образцов таким образом, чтобы оптимизировать качество изображения и существуют различные способы весового (фильтрации ) выборки для каждого пикселя. В Fragmentarium есть некоторый простой встроенный способ передискретизации (оверсэмплинг) - путем установки переменной «AntiAlias», при этом выбирается число сэмплов (на равномерной сетке). Они имеют одинаковый вес (box filtered). Это можно использовать для 2D фракталов - потому что они визуализируются быстрее, что позволительно для большого количества сэмплов. Для 3D - визуализации обычно рендеринг необходим с высоким разрешением изображения и в дальнейшем его можно уменьшить в программе для редактирования изображений - это, кажется, повышает качество изображения при том же количестве сэмплов.

Оцените материал
(0 голосов)
Прочитано 486 раз Последнее изменение Понедельник, 04 Август 2014 16:06

Оставить комментарий

Убедитесь, что вы вводите (*) необходимую информацию, где нужно
HTML-коды запрещены