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

Параллельно разбитые Карты теней (shadow maps) на Программируемых GPU–Часть 1

 

Оригинал статьи:

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

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

10.1 Введение

Методику, которую мы представляем, называют параллельно разбитыми картами теней(PSSMs). В этой методике видимое пространство разбито на множественные уровни глубины, используя плоскости отсечения, параллельные плоскости представления, и независимая теневая карта выполнена для каждого уровня, как показано в иллюстрации 10-1.

clip_image002

Иллюстрация 10-1 параллельно разбитые карты теней

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

По сравнению с другими популярными отображающими тень методиками, такими как проекционные карты теней(PSMs), световые пространственные проекционные карты теней(LiSPSMs) и трапецеидальные карты теней, PSSMs обеспечивают интуитивный путь дискретной аппроксимации разбросанного распределения элементов текстуры теневой карты, но, не отображая особенности и специальные обработки.

Идея использовать множественные теневые карты была представлена в Tadamura. 2001. Далее была изучена в книге Lloyd 2006 и осуществлено как каскадное отображение тени в приложении 3DMark 2006 эталонного теста Futuremark's.

Две главных задачи со всеми этими алгоритмами, включая наш PSSMs, являются следующим:

· Как мы определяем позиции разбиения?

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

Эти две задачи хорошо отработаны в PSSMs. Мы используем быструю и устойчивую независимую от сцены стратегию разбиения, чтобы адаптировать управляемое представлением требование разрешающей способности, и показываем, как использовать преимущества технологий DirectX 9 уровня и DirectX 10 уровня аппаратных средств, чтобы улучшить производительность.

10.2 Алгоритм

В этой главе мы используем направленный свет, чтобы проиллюстрировать методику PSSMs для ясности, но подробности реализации также справедливы для точечного света. Запись PSSM(m., res) обозначает схему разбиения, которая разбивает видимое пространство на m частей; res - разрешающая способность для каждой теневой карты. Иллюстрация 10-2 показывает общую конфигурацию для схемы разбиения с верхним светом, в котором видимое пространство V разбита на {Vi | 0 clip_image003i clip_image003[1]m - 1} используя плоскости отсечения в {Ci | 0 clip_image003[2]i clip_image003[3]m} вдоль оси Z. В частности C 0 = n (позиция передней плоскости) и Cm = f (позиция задней плоскости).

clip_image005

Иллюстрация 10-2 Конфигурация для схемы разбиения с верхним светом

Мы применяем схему разбиения PSSM (m, res) в следующих шагах:

1. Разбиваем видимое простанство V на m частей {Vi}, используя плоскости разбиения {Ci}.

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

3. Генерируем PSSMs {Ti} с разрешающей способностью res для всех частей разбиения {Vi}.

4. Синтезируем тени для сцены.

10.2.1 Шаг 1: Разбиение видимого пространства

Основная задача шага 1 - определение, куда плоскости разбиения помещены. И хотя пользователи могут корректировать позиции разбиения согласно специфическому для приложения требованию, наши реализации используют практическую схему разбиения, предложенную в Zhang 2006.

Прежде, чем мы представим эту схему разбиения, кратко cделаем обзор задачи ступенчатости в теневом отображении, которое было подробно описано в Stamminger and Drettakis 2002, Wimmer 2004, и Lloyd 2006.

В иллюстрации 10-3, световые лучи, проходящие через элементы текстуры (с размером ds), падают на поверхность объекта с длиной dz в световом пространстве. Из стандартной матрицы проекции в Direct3D мы знаем, что размер представления лучей dp (на нормализованном экране) спроектированный от поверхности является dy (z tan f)-1, где 2 f - угол зрения в видимом пространстве. Из локального представления поверхности в иллюстрации 10-3, мы получаем приближение dy clip_image006dz, cosf, cos q, где f и q замещают углы между нормалью к поверхности и вектором к экрану, и плоскостью теневой карты, соответственно.

clip_image008

Иллюстрация 10-3 Ступенчатость Теневой Карты

Ступенчатость Теневой карты

Ошибка ступенчатости для небольшой поверхности определяется как

clip_image009

Мы обычно рассматриваем это представления ступенчатости dp/ds как две части: ракурсная ступенчатость dz/zds и ступенчатость проекции, cosfcosq (отмечают, что f - константа для данной матрицы представления). Cубдискретизация теневой карты может произойти, когда ракурсная ступенчатость или ступенчатость проекции становятся большими.

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

Практическая схема разбиения основана на анализе ракурсной ступенчатости.

Практическая Схема Разбиения

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

clip_image010

где clip_image011 и clip_image012 - позиции разбиения в логарифмической схеме разбиения и равномерной схеме разбиения, соответственно. Теоретически, логарифмическая схема разбиения спроектирована так, чтобы произвести оптимальное распределение ракурсной ступенчатости по целому диапазону глубины. С другой стороны, распределение ступенчатости в равномерной схеме разбиения - то же самое как в стандартных теневых картах. Иллюстрация 10-4 показывает три схемы разбиения в пространстве теневой карты.

clip_image014

Иллюстрация 10-4 Визуализация Практической Схемы Разбиения в Пространстве Теневой карты

Теоретически оптимальное распределение ракурсной ступенчатости делает dz/zds константу по всему диапазону глубины. Как показано в книге Wimmer 2004, следующее простое преобразование дает оптимальную параметризацию теневой карты s (z):

clip_image015

где r - константа. Из того что s (f) = 1, имеем r = ln (f/n). Единственное нелинейное преобразование, поддерживаемое текущими аппаратными средствами, является перспективно проекционные преобразованиея (s = A/z + B), и, таким образом, чтобы аппроксимировать предыдущее логарифмическое отображение от z к s, логарифмическая схема разбиения дискретизирует это в несколько уровней глубины z = clip_image011[1] как показано в следующем уравнении:

clip_image016

Поскольку логарифмическая схема разбиения спроектирована, чтобы произвести теоретически четное распределение перспективной ступенчатости, разрешающая способность, распределенная для каждого разбиения, должна быть 1/m от полной разрешающей способности текстуры. Замена Сi = i/m в предыдущем уравнении дает

clip_image017

Основной недостаток логарифмической схемы разбиения состоит в том, что, практически, длины частей разбиения около наблюдателя являются настолько малыми, что очень немного объектов могут быть включены в эти части разбиения. Представьте ситуацию в схеме разбиения PSSM (3) - что рассматриваемое пространство разбито на три части. С f = 1000 и n = 1, первое разбиение V 0 и второе разбиение V 1 занимают только 1 процент и 10 процентов расстояния наблюдения. Дополнительная выборка обычно происходит для частей около наблюдателя, и субдискретизация происходит для частей дальше от наблюдателя. В результате, на практике логарифмическую схему разбиения сложно использовать напрямую.

Равномерная схема разбиения просто помещает плоскости разбиения равномерно вдоль направления визирования:

clip_image018

Распределение ступенчатости в равномерной схеме разбиения такое же, как в стандартных теневых картах. Поскольку s = (z-n) / (f - n) в стандартных теневых картах, игнорируя ступенчатость проекции, мы имеем

clip_image019

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

Поскольку логарифмические и равномерные схемы разбиения не могут произвести соответствующие плотности осуществления выборки для близких и далеких уровней глубины одновременно, практическая схема разбиения совмещает логарифмические и равномерные схемы, получая умеренные плотности дискретизации по целому диапазону глубины. Вес l корректирует позиции разбиения согласно практическим требованиям приложения. l = 0.5 настройка по умолчанию в нашей текущей реализации. В иллюстрации 10-4 практическая схема разбиения генерирует умеренные плотности плотности дискретизации для близких и далеких частей разбиения. Важное примечание для иллюстрации 10-4: цветовая частота дискретизации в каждой схеме разбиения только для схематической иллюстрации, и не для того, чтобы точно визуализировать распределение ступенчатости в теории. Читатели, интересующиеся распределением ступенчатости во множественных уровнях глубины, могут обратиться к книге Lloyd. 2006.

Предварительная обработка

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

10.2.2 Шаг 2: Вычисление матрицы преобразования света

Как и в стандартном теневом отображении, мы должны знать направление света и матрицы проекции, когда генерируем теневую карту. Разбивая световое пространство W на множественные подпространства {Wi}, нам нужно будет создать независимую матрицу проекции для каждого W i отдельно.

Будем рассматривать две методики для вычисления этих матриц:

· Независимый от сцены метод просто ограничивает световое пространство Wi к разбитому пространству Vi, как показано в на рисунке 10-5. Поскольку информация о сцене не используется, использование разрешающей способности теневой карты могло быть не оптимальным.

clip_image021

Иллюстрация 10-5 Вычисление матрицы проекции цвета для части разбиения.

· Зависимый от сцены метод увеличивает доступную разрешающую способность текстуры, сосредотачивая световое пространство Wi на объектах, которые имеют наклонные тени к пространству разбиения Vi,, как замечено позже в иллюстрации 10-6.

clip_image023

Иллюстрация 10-6 Сравнение Методов Проекции

Независимая от сцены проекция

Прежде, чем вычислять матрицу проекции для подпространства Wi, мы должны найти выровненный вдоль осей ограничивающий прямоугольник (AABB) пространства разбиения Vi по отношению к границам координат освещения. Класс BoundingBox, представленный в иллюстрации 10-5, использует два вектора – векторы минимума и максимума - чтобы сохранить наименьшие и наибольшие координаты, соответственно.

Чтобы упростить вычисления, мы определяем выровненный осью ограничивающий прямоугольник пространства разбиения в пространстве разбиения освещения, используя функцию CreateAABB (). Отметим, что мы установили минимальное z-значение ограничивающего прямоугольника в 0, потому что мы хотим, чтобы позиция передней плоскости оставалась неизменяемой. Мы не хотим изменяемую эту позицию, потому что у нас могли быть отбрасывающие тени предметы между передней плоскостью ограничивающего прямоугольника разбиения и передней плоскостью освещения. Этот случай проиллюстрирован объектом "caster" на рисунке 10-5.

Затем, мы строим матрицу сжатия, чтобы эффективно "раскрыть" световое пространство Wi к ограничивающему прямоугольнику, вычисленному с помощью CreateAABB (). Матрица сжатия - несредняя матрица ортогональной проекции, вычисленная, как показано в Распечатке 10-1.

Пример 10-1. Псевдокод для создания матрицы сжатия из урезанного пространства, ограничивающего значения

clip_image025

Наконец, мы используем преобразование проекции освещения lightViewMatrix * lightProjMatrix * cropMatrix, когда генерируем элементы текстур теневой карты Ti

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

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

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