четверг, 16 июня 2011 г.

Области рассеивания в схеме затенения. (Перевод) Часть 1

 
В этой главе мы рассмотрим фильтрацию схемы затенения и сглаживание тени.
Мы рассмотрим рассеивающие алгоритмы для теневых карт и объясним, каким образом они могут помочь в решении многих общих проблем, связанных с тенями. Мы также представим простой, но эффективный метод для сокращения потери света при  рассеивании (VSMs).
Наконец, мы введём алгоритм для теней в реальном времени, основанный на VSMs и таблицах областей (SATs). Мы добьемся эффективного вычисления теней для фильтрования случайных прямоугольных областей, которое делает рассеивание в теневой карте (SAVSM) идеальным алгоритмом для смягчения теней без помех.
8.1 Введение
Теневая карта (Williams 1978) – популярный алгоритм создания теней, имеющий ряд преимуществ по сравнению с теневыми слоями (Crow 1977). В частности, теневые карты отлично работают в произвольных местах и менее чувствительны к геометрической сложности объектов. К сожалению, стандартные теневые карты также страдают от ряда хорошо известных артефактов отображения текстур.
Артефакты увеличиваются в случае, если текселы (тексел - шаблон с образцом растровой текстуры в совокупности с данными описания поверхности и модели освещения элемента) прогнозируемой теневой карты пытаются охватить большую часть пространства в экране. И наоборот, мини-артефакты появляются когда несколько текселов теневых карт отображаются на одном пикселе.
В центре внимания этой главы находится решение всех этих вышеперечисленных проблем правильной фильтрацией теневых карт.
clip_image001
Рисунок 8-1 является хорошим примером эффективного смягчения с использованием методов, использованных в главе.
8.2 Предварительный обзор
Одним из методов снижения наложения теневых карт заключается в изменении проекции так, чтобы артефакты сократились. Было много научных исследований в этой области, особенно в отношении перспективных теневых карт («Stamminger and Drettakis 2002»), карты теней в свете («Wimmer et al. 2004»), а также трапециевидная теневая карта («Martin and Tan 2004»). Если сцена содержит только один планарный приемник тени, невозможно добиться идеального одного к одному, текселу к пикселю картирования с помощью единой аффинной проекции.
Чтобы правильно обрабатывать мини-артефакты необходима фильтрация текстур. К сожалению, аппаратная фильтрация текстур (трехцветная линейная и анизотропная фильтрация) неприменима к стандартным теневым картам. Аппаратная будет усреднять глубину, в результате чего отфильтрованная глубина будет по-прежнему подвергаться бинарному сравнению, что не есть хорошо. Процентно-приближенная фильтрация (PCF) (Reeves et al. 1987) решает эту проблему, достигая правильного результата путем фильтрации результатов нескольких углубленных сравнений, а не самих значений глубины.
Другим решением является использование разницы теневых карт (Donnelly and Lauritzen 2006). Для исправления каждому текселу в соответствие ставится распределение значений глубины, а не отдельного углубленные точки. Таким образом, теневые карты могут быть отфильтрованы линейно. В данных случаях применяются такие методы, как «mipmapping», анизотропной фильтрация и таблицы усредненных зон.
Заметьте, что фильтрация теневой карты обычно деформируется в ортогональной проекции. В частности, фильтрации мало для решения проблемы крупных артефактов, и эта проблема является главной заботой алгоритмов планирования деформации. Таким образом, оба этих метода должны быть использованы совместно в теневой карте.
В этой главе мы немного рассмотрим фильтрацию в процентном приближении (PCF), а затем мы фокусируем внимание на расхождение теневых карт, поскольку они имеют несколько полезных показателей и качественных характеристик.
8.3 Метод Percentage Closer Filtering
PCF работает, сортируя в пространстве окна пиксели по степеням, и отбирает «пробы» из рассортированных регионов. (Это процесс похож на стандартную фильтрацию текстур) Каждый образец затем бинарно сравнивается с глубиной. Далее, результаты сравнения объединяются для расчета доли текселов в фильтре региона, которые находятся ближе, чем глубины. Этот показатель используется для смягчения света.
(Reeves et al. 1987) Замечено, что увеличение размера фильтра региона смягчает края тени, как показано на Рисунке 8-2. По минимальному размеру фильтра мы можем получить мягкие края, и в то же время избежим мини-артефактов. Большие размеры фильтра, однако, требуют высоты разрешающих теневых карт чтобы сохранять детали.
clip_image002
Рисунок 8-3. Приимер Percentage-Closer Filtering (PCF)
Для предотвращения лишних теней, мы должны выбрать уровень ограничения, который будет пропорционален максимальной глубине диапазона, охватываемого любыми текселами в теневой карте. Конечно, этот диапазон может быть произвольно большой, и установление больших требований соответственно заставит тени тянуться от их выделяющихся областей (известных как Peter Panning). Выбор за тексел глубину смещения пропорционального полигона, как это было предложено Kilgard в 2001, может помочь, но это не устраняет проблему.
Отбор соседних текселов для метода PCF делает ситуацию хуже, потому что это фактически вызывает отклонение пропорционально глубине окружности за всей фильтруемой областью. Потому что эта область вычисляется динамически, и невозможно выбрать хороший граничный тексел, который будет работать для фильтров всех размеров.
8.4 Разница теневых карт.
Еще одно элегантное решение проблемы фильтрации теневой карты заключается в том, чтобы использовать разницу теневых карт. Основная идея заключается в том, чтобы представлять глубину данных таким образом, что можно было бы отфильтровать линейно, и использовать алгоритмы и аппаратные средства, которые работают с цветом и другими линейными данными.
Разработанный алгоритм похож на алгоритм для стандартных карт теней, за исключением того, что вместо того, чтобы просто писать глубину тени, мы напишем глубину и квадрат глубины на двух-компонентные разницы теневых карт. По фильтрации некоторых зон, мы можем восстановить моменты M1 и M2 из глубины распространения в этой зоне, где
clip_image003
Отсюда мы можем вычислить среднее м, а разница с квадратом по распределению:
clip_image004
Используя эту разницу, мы можем применить неравенство Чебышева для расчета верхней границы вероятности того, что в настоящее время затененные поверхности (на глубине т) сходятся:
clip_image005
Этот "односторонняя" версия Чебышевских неравенств является действительным для Т> М. Если T <= M, Pmax = 1, и поверхность в полной мере освещены.
Неравенство дает верхнюю границу по взаимных фильтраций в результате фильтрации произвольного региона. Важно что (Donnelly and Lauritzen 2006) это неравенство становится точным для одной плоскости, которая является разумным приближением для многих реальных сцен. В частности, для одной точки есть несколько соседей, в которых они будут плоские, и, таким образом, Pmаx вычисление этого региона будет хорошим приближением истинной вероятности.
Таким образом, мы можем использовать P макс непосредственно для рендеринга.
Листинг 8-1 приводит некоторые примеры кода в HLSL.
Заметим, что это полезно для фиксирования минимального значения, как мы делали выше, чтобы избежать каких-либо числовых вопросов, которые могут возникнуть во время фильтрации. Кроме того, просто фиксация дисперсии часто смещает тени (подробнее в разделе 8.4.2).
8.4.1 Фильтрация разницы теневых карт
Теперь о том, что для линейной фильтрации теневой карты существует целый ряд методов и алгоритмов, имеющихся в нашем распоряжении. В частности, мы можем просто позволить «mipmapping», или Трехцветную линейную и анизотропную фильтрацию, и даже multisample-инговое сглаживание. Это только существенно улучшает качество по сравнению с использованием стандартных теневых (показано на Рисунке 8-4)
clip_image006
Рисунок 8-4. Анизотропная фильтрация с разницей в теневых картах.
Пример 8-1. Поиск Pmax During Scene Shading
float ChebyshevUpperBound(float2 Moments, float t)
{
// One-tailed inequality valid if t > Moments.x
float p = (t <= Moments.x);
// Compute variance.
float Variance = Moments.y – (Moments.x*Moments.x);
Variance = max(Variance, g_MinVariance);
// Compute probabilistic upper bound.
float d = t – Moments.x;
float p_max = Variance / (Variance + d*d);
return max(p, p_max);
}
float ShadowContribution(float2 LightTexCoord, float DistanceToLight)
{
// Read the moments from the variance shadow map.
float2 Moments = texShadow.Sample(ShadowSampler, LightTexCoord).xy;
// Compute the Chebyshev upper bound.
return ChebyshevUpperBound(Moments, DistanceToLight);
}
Мы можем сделать гораздо больше. В частности, (Donnelly and Lauritzen 2006) предполагается стирание разницы теневых карт до затенения (простой коробки фильтра достаточно). Этот подход эквивалентен приближенной фильтрации по среднему среди соседей, однако он значительно дешевле, в связи с использованием разделенного размытия. Как отмечалось ранее, фактически фиксированная минимальная ширина фильтра, смягчая края теней, помогает скрыть увеличение артефактов.
Альтернативой использования аппаратных фильтрации заключается в том, чтобы использовать таблицы с суммами по зонам, которые также требуют линейную фильтрацию данных. Мы обсудим этот вариант более подробно в разделе 8.5.
8.4.2 Смещение
В дополнение к легкому представлению и высокому качеству фильтрации, разница теневых карт применима для элегантного решения проблемы смещения тени.
Как мы обсуждали в относительно приближенной фильтрации, полигоны, которые охватывают большие глубины, как правило, имеют проблему с алгоритмами теневых карт. Разница теневых карт, однако, дает нам способ представлять глубины, используя второй момент M2.
Вместо того чтобы учитывая весь масштаб теневой карты (тексел был бы на глубине м) мы считаем, что представить планарное распределение можно через параметр:
clip_image007
Затем мы можем вычислить M2, используя линейность оператора, и используя тот факт, что E (X) = E (Y) = E (XY) = 0:
clip_image008
Теперь, представим пиксель как симметрическое гауссовское распределение, как половинку пикселя стандартного отклонения:
clip_image009
Поэтому
clip_image010
Заметим, что эта формула сводится к простой, когда частные производные являются нулем (то есть, когда поверхность параллельна с поверхностью плоскости). Также заметьте, что никаких дополнительных проблем не возникнет в результате увеличения ширины фильтра, так что разница будет автоматически вычисляться по всему региону.
Мы можем легко вычислить моменты в теневой карте изображения, используя метод HLSL. Инструкция для частной производной показана в Листинге 8-2.
Есть ещё вопрос, который остается не до конца решенным. Мы можем полностью зафиксировать минимальную разницу при небольших потерях для вычисления Pmax (как в листинге 8-1) Эта величина не зависит от геометрии сцены, поэтому она может быть установлен один раз. Таким образом, только одно смещение является веской причиной для использования разница теневых карт. (это продемонстрировано на Рисунке 8-5)
clip_image011
Рисунок 8-5 Разница Теневых Карт решает вопросы Смещения
Пример 8-2. Вычисление моментов через разницу теневых карт с рендерингом
float2 ComputeMoments(float Depth)
float2 Moments;
// First moment is the depth itself.
Moments.x = Depth;
// Compute partial derivatives of depth.
float dx = ddx(Depth);
float dy = ddy(Depth);
// Compute second moment over the pixel extents.
Moments.y = Depth*Depth + 0.25*(dx*dx + dy*dy);
return Moments;
Наконец, как правило, это, выгодно для фиксирования частичной производной части момента M2. В данном случае аппаратно-порожденные частные производные стали несколько нестабильны, и, соответственно, нестабильная разница может быть сбита случайными проблесковыми пикселями света в регионах, которые должны быть полностью затемнены.
На многих сценах можно избежать этой нестабильности полностью, если не использовать частную производную вообще. Если тень резолюции является достаточно высокой, фиксированная минимальная разница может обеспечить всё, что требуется для устранения поверхностных ошибок.

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

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