суббота, 30 апреля 2011 г.

Упрощённый пошаговый конусный метод ( конусное отображение)в рельефном моделировании-Часть 2

 

Ссылка на оригинал

http://http.developer.nvidia.com/GPUGems3/gpugems3_ch18.html

18.4.1 Вычисление упрощённого конусного метода

Как и в пошаговом конусном методе, рассматриваемый подход требует чтобы мы построили конус для каждого элемента текстуры. Каждый конус обусловлен отношением своей ширины к высоте ( см. Рисунок 18-7с). Т.к. это отношение может хранится в одном из каналов текстурной модели, оба отображения – и глубинное и конусное хранятся в альфа-динамичной текстуре. Кроме того, коническое отображение может храниться в голубом канале рельефной текстуры ( в месте с двумя первыми компонентами нормали, записанными в красном и зелёном каналах).

Для каждого обращения к элементу текстуры ti на упрощённом конусном отображении угол конуса Сi ( разворот конуса) располагается на ti таким образом, чтобы ни одна из проекций не пересекала верхнюю плоскость более одного раза, при построении проекции в Сi. На рисунке 18-7b мы можем посмотреть на вышеописанную ситуацию, изображенную с помощью лучей и конуса ( конус зелёного цвета). Заметим, что конусный метод, конусное отображение, может быть использовано для ускорения нахождения пересечения теневых лучей с приподнятыми облостями. На рисунке 18-6 мы видим отрендеренное изображение с собсвенной тенью, составленное из результатов достигнутых тремя методами пофрагментного перемещения: различными подходами к рендерингу : (a) - рельефное моделирлвание с использованием линейного поиска, (b) - конусный пошаговый метод и (c) - рельефное моделирование с использованием упрощённого пошагового метода. Заметим что получившаяся тень складывается из результатов линейного поиска и из-за результатов ранней остановки пошагового конусного метода.

clip_image002

Рис.18-6 Рендеринг изображения с тенью, с использованием различных подходов

Упрощённый метод конусов даёт возможность вектору проекции достигнуть поверхности, однако этого не происходит. Мы создали упрощённый метод конусов используя О (n^2) алгоритм описанный с помощью псевдокода на Листинге 18-1.

Идея в том, чтобы для поиска каждой точки текстуры ti провести проекцию через каждое tj например как эта проекция, которая стартует в точке (ti.texCoord.s, ti.texCoord.t, 0.0) и достигает (tj.texCoord.s, tj.texCoord.t, tj.depth). Для каждого такого луча вычисляется следующее пересечение с вершиной плоскости и эта точка используется для нахождения отношения cone_ratio(i,j). На рисунке 18-7с изображена ситуация для данной пары точек ti, tj из искомой и исходной текстуры. Итоговое значение отношения Ci 's мы получаем, вычисляя наименьшее конусное отношение для ti , оно изображено на 18-7b. Упрощённый конусный метод завершает работу после нахождения всех исходных точек текстуры.

clip_image004

Рис.18-7. Вычисление упрощённого конусного метода

Пример 18-1. Псевдокод для вычисления упрощённого конусного метода.

for each reference texel ti do

radius_cone_C(i) = 1;

source.xyz = (ti.texCoord.s, ti.texCoord.t, 0.0);

for each destination texel tj do

destination.xyz = (tj.texCoord.s, tj.texCoord.t, tj.depth);

ray.origin = destination;

ray.direction = destination - source;

(k,w) = text_cords_next_intersection(tj, ray, depth_map);

d = depth_stored_at(k,w);

if ((d - ti.depth) > 0.0) // dst has to be above the src

cone_ratio(i,j) = length(source.xy - destination.xy) /

(d - tj.depth);

if (radius_cone_C(i) > cone_ratio(i,j))

radius_cone_C(i) = cone_ratio(i,j);

Напомним, что в псевдокоде, из Листинга 18-1 так же, как и в коде из Листинга 18-2, мы фиксируем максимальное конусное отношение на 1.0

Это сделано для того, чтобы сохранить данные по конусному моделированию в целочисленных текстурах. Хотя использование текстур с плавающей точкой предоставит нам возможности для работы с большими конусными значениями, что позволит улучшить результаты « скачковых» алгоритмов, на практике же только небольшое количество точек текстуры из конусного пространства, конусного моделирования, подходят для того, чтобы принимать участие в такого рода эксперементах. Так например на рисунке 18-8с только насыщенные ( белые) точки текстуры могут претендовать на попадение в текстуру с плавающей точкой.

clip_image006

Рис. 18-8 Сравнение различных результатов конусного моделирования а так же Глубинного моделирования

В листинге 18-2 представлен колеровщик ( программа для построения теней), для генерации упрощённого конусного метода. На рисунке 18-8 представлены 3 различных вида конусного моделирования для глубинной текстуры, ассоциированной с рельефной текстурой из рисунка 18-2. На рисунке 18-8а изображен обыкновенный конусный метод

(Даммер, 2006), результаты которого хранятся в одиночном текстурном канале. На рисунке 18-8b, мы видим четырёх-направленный конусный метод, который хранит конусные отношения для четырёх важнейших направлений в различных каналах текстуры. Обратите внимание, как различные области текстуры сопоставлены с расширенными конусами на разных направлениях. Красные точки текстуры подсвечивают конусы расширяющиеся направо, в то время как зелёные – расширяющиеся налево. Голубые точки текстуры подсвечивают конусы расширяющиеся книзу, а чёрные – кверху. На рисунке 18-8c мы можем увидеть результаты упрощённого метода конусов, данные по которому хранятся в доном канале текстуры. Заметьте что точки текстуры из этого метода намного ярче точек из обычного конусного метода на рисунке 18-8а.

Листинг 18-2. Колеровщик для генерации упрощённого конусного метода.

float4 depth2relaxedcone(

in float2 TexCoord : TEXCOORD0,

in Sampler2D ReliefSampler,

in float3 Offset ) : COLOR

{

const int search_steps = 128;

float3 src = float3(TexCoord,0); // Source texel

float3 dst = src + Offset; // Destination texel

dst.z = tex2D(ReliefSampler,dst.xy).w; // Set dest. depth

float3 vec = dst - src; // Ray direction

vec /= vec.z; // Scale ray direction so that vec.z = 1.0

vec *= 1.0 - dst.z; // Scale again

float3 step_fwd = vec/search_steps; // Length of a forward step

// Search until a new point outside the surface

float3 ray_pos = dst + step_fwd;

for( int i=1; i<search_steps; i++ )

{

float current_depth = tex2D(ReliefSampler, ray_pos.xy).w;

if ( current_depth <= ray_pos.z )

ray_pos += step_fwd;

}

// Original texel depth

float src_texel_depth = tex2D(ReliefSampler,TexCoord).w;

// Compute the cone ratio

float cone_ratio = (ray_pos.z >= src_texel_depth) ? 1.0 :

length(ray_pos.xy - TexCoord) /

(src_texel_depth - ray_pos.z);

// Check for minimum value with previous pass result

float best_ratio = tex2D(ResultSampler, TexCoord).x;

if ( cone_ratio > best_ratio )

cone_ratio = best_ratio;

return float4(cone_ratio, cone_ratio, cone_ratio, cone_ratio);

}

18.4.2 Рендеринг с использованием упрощённого конусного метода.

Чтобы оттенить фрагмент объекта, проследим за проекционным лучом, который проходит через всю текстуру, используя упрощённый «прыжковый» метод конусов. Будем двигаться по проекции, пока не достигнем точки внутри рельефной плоскости. Этот процесс напоминает описанный в пункте 18.3 для обыкновенного конусного метода. На рисунке 18-9 изображена методика поиска точки пересечения трансформированной проекции и конуса. Во первых, мы вычисляем направление вектора, раскладывая его на z компоненты (ray.direction.z), после чего, соответственно рисунку 18-9, можно записать следующее:

Уравнение 1

clip_image008

Соответственно,

Уравнение 2

clip_image010

Складываем уравнения 1 и 2 и получаем:

Уравнение 3

clip_image012

Из уравнения 3 получаем точку пересечения I:

Уравнение 4

clip_image014

clip_image016

Рис.18-9. Пересечение проекции вида с конусом.

Код из Листинга 18-3 описывает функцию пересечения проекции для упрощённого пошагового конусного метода. Для наглядности, первый цикл имеет ограниченное количество шагов конусного метода. Заметим, что использование функции saturate() необходимо для вычисления величины шага. Это гарантирует, что мы остановимся на первой точке текстуры, когда луч проекции будет находиться под рельефной плоскостью. В конце данного процесса, когда проекция предположительно достигла плоскости, мы запускаем бинарный поиск для поиска координат точки пересечения. Получив эти координаты, закрасим объект, как показано на рисунке 18.2.

Листинг 18-3. Проекция пересекает Конус построенный с помощью упрощённого пошагового метода.

// Ray intersect depth map using relaxed cone stepping.

// Depth value stored in alpha channel (black at object surface)

// and relaxed cone ratio stored in blue channel.

void ray_intersect_relaxedcone(

sampler2D relief_map, // Relaxed cone map

inout float3 ray_pos, // Ray position

inout float3 ray_dir) // Ray direction

const int cone_steps = 15;

const int binary_steps = 6;

ray_dir /= ray_dir.z; // Scale ray_dir

float ray_ratio = length(ray_dir.xy);

float3 pos = ray_pos;

for( int i=0; i<cone_steps; i++)

{

float4 tex = tex2D(relief_map, pos.xy);

float cone_ratio = tex.z;

float height = saturate(tex.w – pos.z);

float d = cone_ratio*height/(ray_ratio + cone_ratio);

pos += ray_dir * d;

}

<STRONG>

<EM>// Binary search initial range and initial position</EM>

<EM>float3</EM>

</STRONG> bs_range = 0.5 * ray_dir * pos.z;

float3 bs_position = ray_pos + bs_range;

for( int i=0; i<binary_steps; i++ )

{

float4 tex = tex2D(relief_map, bs_position.xy);

bs_range *= 0.5;

if (bs_position.z < tex.w) // If outside

bs_position += bs_range; // Move forward

else

bs_position -= bs_range; // Move backward

}

Пусть f – это фрагмент который должен быть закрашен, и К – точка в которой останавливается проекция вида (это так, до того как запущен бинарный поиск), как например показано на рисунке 18-10. Если было использовано несколько шагов – то проекционный луч может остановиться до того, как достигнет поверхности. Следовательно, чтобы осуществить прохождение вектора через все недостаточно массивные структур ( см. пример на рис. 18-4а), мы используем К как конечную точку для бинарного поиска. В этом случае, если проекция не достигает поверхности, поиск начинается с точки К.

clip_image018

Рис. 18-10 Проекция вида пересекающая фрагмент, с текстурными координатами

Пусть (m, n) координаты текстуры, записанные в К и пусть dK – глубина, хранящаяся в (m, n) (см. рисунок 18-10). Бинарный поиск будет вычислять точку пересечения на отрезке от точки Н до точки К, которая соответствует координатам текстуры ((s + m)/2, (t+n)/2) до (m, n), где (s, t) – координаты текстур фрагмента f (рис.18-10). На этом отрезке величина проникновения проекции варьируется от (dK /2) до dK .Обратите внимание на то, что вообще-то, мы можем использовать точки (m, n) и (q, r) (координаты текстуры точки J, первая точка пересечения на проекции) в качестве предельов для бинарного поиска.

Однако, т.к. мы используем фиксированное число итераций по алгоритму упрощённого конусного метода, сохранение точки (q, r) требует обуславливания в коде.

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

Естественно, что использование упрощённого конусного метода приводит к тем же результатам, что и обычный конусный метод. ( Рис. 18-1b). На практике же, упрощённый метод требует гораздо меньшее количество итераций, до того как начнут появляться расширяющиеся конусы. Основываясь на нашем опыте, мы можем предположить, что для достижения необходимых результатов достаточно 15 итераций.

18.5 Заключение.

Комбинация, использующая конический пошаговый метод и бинарный поиск для вычисления ограниченных полей и их пересечений уменьшает количество появившихся artifacts на изображениях сгенерированных с помощью пофрагментного моделирования. Расширяющиеся конусы достигают более эффективного расположения в пространстве засчёт использования бинарного поиска, применяемого, также, для увеличения точности. Если используется слишком мало итераций, конечное изображение будет с теми же artifacts что были замечены при пошаговом коническом моделировании (Dummer 2006).

На практике, однако, наша техника даёт лучшие результаты на том же количестве итераций или с тем же количеством текстурных данных. Это важно .в первую очередь, для новых выпусков GPU, т.к. как только качесвто вычисления и компьютерное представление объекта улучшаться – только тогда повысится пропускная способность вычисления объектов.

Упрощённый пошаговый конусный метод неразделим с рельефным моделированием, и это правильно. Рис. 18-11 показывает использование УКМ при рендеринге глубинно-связанных значений (рис. 18-11b и 18-11d) и изменении некоторых факторов (рис. 18-11c и 18-11d). Обратите внимание, что эти эффекты получены с помощью надлежайшей корректировки направлений проекционных лучей (Policarpo et al. 2005) и не связаны с изменением конусных собсвенных значений 9 высоты, ширины)

clip_image020

Рис.18-11. Изображение показывающее изменение значений глубины и фрагментарности

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

К тому же, мипмэппинг придётся выполнять вручную, брать мнимальную величину для каждой группы точек и т.п. Instead, one should compute the mipmaps manually, by conservatively taking the minimum value for each group of pixels. Альтернативным методом является использование конических методов, стратегии ближайших соседей. В этом случае когда объект виден на каком-то расстоянии, правильно выбранный цвет текстуры помогает спрятать неточности, получненные при применении отображения с высоким разрешением. Таким образом единственный недостаток блокирующий применение мипмэппинда в коническом отображении это недостатки в представлении – не всегда видны более мелкие текстуры.

18.5.1 Дальнейшее чтение.

Отображение рельефных текстур было введено Oliveira et al. 2000 с использованием двойного обращения к периоду, предшествующему деформации, вызванной традиционным текстурным отображением. Предпериод повреждения, базирующийся на глубинном отображении, вычисляется в процессоре, а затем, результаты направляются на устройство обработки графики, для конечного моделирования. В качестве введения в фрагментные процессоры Policarpo et al. (2005) выделял в первую очерель технику для произвольного полигонального вычисления ( моделирования) и показывал, как эффективно эти методы работают в GPU. Этот симбиоз был достигнут, благодаря представлению пересечения векторно-ограниченного поля в 2D текстурном пространстве.

Oliveira and Policarpo (2005) так же описывали способы рендеринга кривых силуэтов путём установки квадратичности на каждой из вершин модели. Позднее, они показали, как отрендерить детали рельефа в предшествующих приложениях, с использованием максимально агрессивног (Policarpo and Oliveira 2006a).

Так же они описали технику отображения неограниченных полей и структур на основе полигональных моделей а так же с помощью введения нового класса замен.( фальшивок). (Policarpo and Oliveira 2006b).

К тому же, Oliveira and Brauwers (2007) показали, как использовать 2D текстуры для исследования пересечения векторов с лубинными отображениями под проекцией перспективы и как использовать полученные результаты чтобы отрендерить рефракции в реальном времени, а так же изменение среды объекта и его деформацию.

Комментариев нет:

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