8.4.3 Light Bleeding (нежелательный свет)
Одна известная проблема при дисперсии теневых карт является потенциальность для появления легких пучков света. Свет появляется в районах, которые должны быть полностью в тени. Этот артефакт, вы как правило, видели, когда мягкие края тени видны, как показано на Рисунке 8-6. На рисунке 8-7, самый нежелательный свет возникает, когда соотношение Da к Db велико.
Рисунок 8-6 Light Bleeding (нежелательный свет виден под дном фигуры)
Рисунок 8-7. Как образуется этот нежелательный свет (Light Bleeding)
Эта проблема не может быть полностью решена без принятия больших проб. Это справедливо для любого алгоритма, поскольку видимость большого региона, образуется пошаговой функцией.
Конечно, мы часто можем ускорить фильтрацию, используя разницу теневых карт, но желательно это делать с N-отличной фильтрацией для региона с N элементами. Любой алгоритм, который не выбирает все значения N, не может правильно восстановить функцию видимости, потому что идеальная функция имеет N уникальных произведений. В результате алгоритма отбора теневых карт, вычисление точного решения для фильтра регионов должно быть гибким.
Это требование неудобно, но тем не менее, разница карты теней на самом деле являются хорошими строительными блоками для точного и приближенного алгоритма оттенения. В первую очередь мы заинтересованы в сохранении высокой производительности, и готовы согласиться с некоторыми редкими физическими неточностями. Из приближенных алгоритмов, это возможно, наиболее перспективный подход.
Pmax может в значительной степени уменьшить появления света, ценой некоторого потемнения в полутёмных регионах.
Примерный алгоритм борьбы с нежелательным появлением света.
Важным замечанием является то, что часто из неравенств Чебышева получается, что поверхность никогда не достигает полной интенсивности.
Можно это исправить, изменив Pmax так, чтобы любые значения ниже определенных минимальных интенсивностей были нулями, а остальные значения единицами (при минимальной интенсивности).
Эта функция может быть сделана в HLSL так, как показано в листинг 8-3.
Пример 8-3. Снижение появления нежелательного света.
float linstep(float min, float max, float v)
{
return clamp((v – min) / (max – min), 0, 1);
}
float ReduceLightBleeding(float p_max, float Amount)
{
// Remove the [0, Amount] tail and linearly rescale (Amount, 1].
return linstep(Amount, 1, p_max);
}
Заметим, что linstep() может быть заменен на [0, 1]. Например, smoothstep() производит кубический спад функции, что может будет хорошо)
Суммируем параметры определяемых пучков света. Получаем масштабно-независимую сцену. Сцены с более легкими нежелательными появлениями света, как правило, требуют более высокой стоимости. Нужны оптимальные настройки, с отрегулированным соотношением источника и приемника света. Иногда следует повозиться с этим параметром, поскольку установление слишком высокого соотношения уменьшит детали тени. Соотношение должно быть установлено достаточно высоким для устранения наиболее нежелательных появлений света, сохраняя при этом как можно больше деталей.
На практике это решение эффективно работает подобно тому, как показано на рисунке 8-8. Уменьшение нежелательного появления света является гораздо более приоритетным, чем точность адаптивного алгоритма для приложений и игр.
Рисунок 8-8 Результаты после применения метода снижения нежелательного появления света (Light-Bleeding).
8.4.4 Числовая стабильность
Еще одна потенциальная проблема – это проблема числовой стабильности. К счастью, простым решением проблемы является использование 32-битной плавающей точки и фильтрации текстур, которые поддерживаются на картах серии GeForce 8.
Рекомендуется также использовать линейную метрическую глубину, а не «пост Z» прогноз. Последний метод имеет значительные потери точности. Эта потеря не может быть большой проблемой для сравнения на основе теневых карт процентно-приближенной фильтрацией, однако эти потери делают разницу вычислений нестабильной. Линейные метрики с более однородными измерениями (например, расстояние до источника света) являются более подходящими и стабильными.
В Листинге 8-4 приведен пример реализации метода с "расстоянием до источника света" глубины метрики на прожектор или на светящуюся точку.
Отметим, что глубина метрики может быть легко нормализованной на [0,1], если используется формат фиксированной точки теневой карты. Для направленного света "расстояние до светлой плоскости" является подходящей метрикой, и может быть получена из Z-оценки фрагмента в светлоё зоне. Кроме того, это значение Z может быть вычислено в вершинных шейдерах и безопасно интерполировано, а нелинейная length() функция в листинге 8-4 должна быть создана на каждый пиксель.
Мы уже видели немного не числовые проблемы со стабильностью, когда мы использовали линейные метрические глубины с 32-битной плавающей точкой.
Листинг 8-4. Использование Метрики линейной глубины для источника света
// Render variance shadow map from the light's point of view.
DepthPSIn Depth_VS(DepthVSIn In)
{
DepthPSIn Out;
Out.Position = mul(float4(In.Position, 1), g_WorldViewProjMatrix);
Out.PosView = mul(float4(In.Position, 1), g_WorldViewMatrix);
return Out;
}
float4 Depth_PS(DepthPSIn In) : SV_Target
{
float DistToLight = length(In.PosView);
return ComputeMoments(DistToLight);
}
// Render and shade the scene from the camera's point of view.
float4 Shading_PS(ShadingPSIn In) : SV_Target
{
// Compute the distance from the light to the current fragment.
float SurfaceDistToLight = length(g_LightPosition – In.PosWorld);
. . .
}
8.4.5 Реализация
На данный момент разница теневых карт обеспечивает эффективную фильтрацию, легко смягчает края тени, а также решает проблемы со смещением проблем стандартных теневых карт. Более того, реализация на сегодняшний день отлично подходит для использования в играх и других приложений реального времени.
Подводя итог, можем разделить теневые карты следующим образом:
- Рендеринг разницы теневых карт с помощью линейной глубинной метрики (Листинг 8-4), выводит глубину квадрата (Листинг 8-2). Использование мультисемплингова сглаживания (MSAA) на теневой карте (если это возможно).
- Опционально стирание разницы теневых карт с помощью разделяющего на блоки фильтра.
- Генерация множественного отображения как везможная теневая карта.
- Рендеринг сцены, проектирование текущего фрагмента в светлой зоне, как обычно, но с использованием одной, фильтрованной (анизотропная и трехцветная линейная) разницы в теневых картах для получения двух моментов.
- Использование неравенства Чебышева для вычисления Pmax (Листинг 8-1).
- При желании, применение уменьшения нежелательных появлений света с помощью Сmax (Листинг 8-3).
- Использование Pmax за счет вклада полутени.
Использование разницы теневых карт аналогично использованию нормальных теневых карт, за исключением того, что могут быть использованы размывание, мультисемплинг (multisampling) и фильтрации. Заметим, однако, что некоторые методы, используемые для стандартных карт теней (как, например, следующие методы) являются неприменимыми к разницам теневых карт:
- Использование метрик из предыдущих методов не будет работать в разнице теневых карт должным образом, поскольку восстановленные глубина распространения должна представлять собой глубину от ближайшей главной тени в светлой зоне. Это не является проблемой, однако, используется метод для второй глубины рендеринга чтобы избежать вопросов, которые можно решить непосредственно с разницей теневых карт (см. раздел 8.4.2).
- Рендеринг только в источниках (а не приемник) разницы карт теней неверно! Чтобы интерполяционная работала должным образом, на полученной поверхности должны быть представлены глубины распределения. Если это не так, то полутень будет неправильного размера и не плавно не перейдет со светлой на темную сторону.
Проекционная деформация и усечение разметки полностью совместимы с методом VSMs. Действительно, два метода дополняют друг друга. Разница теневые карты скрывает многие артефакты, полученные деформацией и усечением разметки. К тому же получается,что когда камера движется, скрываются разрывы между точками и тень плавает вдоль краев.
8.4.6 Разница Теневых карт. Смягчение тени.
Продвигаясь вперед, мы решаем несколько вопросов с помощью аппаратного фильтра. Во-первых, высоко качественные аппаратные фильтрации могут быть впринципе недоступны.
Как мы уже видели ранее, фиксация минимальной ширины фильтра смягчает тени краев. Предыдущие алгоритмы пользовались этой возможность, выбрав фильтр ширины динамическим, и основываясь на процессе "Блокировщик глубины". Такой подход может дать убедительную полутень, если расстояние между приемником и обьектом высоко.
К сожалению, мы не можем использовать для размывания фиксированную минимальную ширина фильтра в этом случае, потому что ширина изменений на пиксель считается на основе результатов фиксирования. Мы можем, безусловно, множественное отображать уровни о том, что аппаратные средства используются, но с использованием множественных отображений для размытия. Таким образом появляются крайне нежелательные квадратные артефакты, как показано на Рисунке 8-9. Существует несколько способов для получения более точных результатов: с помощью высокого фильтра вручную создать множественное отображение уровней, что является перспективным направлением для дальнейшей работы.
Рисунок 8-9 Box артефакты
Самое благоприятое обстоятельство это то что мы можем выбирать размер фильтра динамически на пиксель, как в идеале при постоянной стоимости и без динамического ветвления.
8.5 Сумма зон разницы теневых карт
Сумма зон в таблице была введена Crow 1984 для ускорения фильтрации текстур. При использовании источника текстуру с элементами A [I, J], мы можем построить сумму района в таблице т [I, J], с тем чтобы
Иными словами, каждый элемент является суммой всех элементов текстуры в прямоугольнике сверху и слева (или ниже). Рисунок 8-10 показывает пример некоторых произвольных данных, посчитанных по суммам.
Рисунок 8-10 Выборки данных и суммарных с ней суммарных зон таблицы
Сумма любой прямоугольной области может быть определена в постоянном
времени:
Мы можем легко вычислить среднее значение на этом регионе путем деления на количество пикселей в регионе. Билинейные интерполяции могут быть использованы при отборе проб в углах и производстве плавного градиента.
Заметим, что эта формула использует исключительно "max" стороны и "min" стороны прямоугольника. Если вычесть 1 из координат до поиска, то будет производиться болшая в соотношении min-inclusive/max-exclusive политика.
В примере из рис 8-10, мы можем вычислить сумму или среднее значение выделенного прямоугольника по данным опроса выделенного значения от "САТ" (в этом примере, рассматривали вычитание с обеих сторон для простоты). Это получается:
S = 28 - 8 - 6 + 2 = 16,
которое является правильной суммой свыше выделенною области данных. Деление на количество элементов в регионе (4) дает правильное среднее 4.
Суммарная таблица дает нам возможность выборки произвольных прямоугольных регионов, которые являются достаточными для наших целей. Они, однако, могут быть продлены до адаптивного образца не прямоугольных регионов (Glassner 1986).
8.5.1 Генерация Таблицы сумм региона
Мы хотим создать таблицу сумму региона на GPU для достижения лучшей производительности и чтобы избежать чрезмерных движений данных. Два алгоритма, в частности, являются потенциально подходящими: строковый и рекурсивный.
Строковый суммирует линию за линией, выполняя одну задачу. На GPU этого алгоритма могут быть реализовано, работая с одной строкой за раз, добавляя текущую строку с предыдущей сумме. Недостатком этого метода является то, что он требует проход по ширине и высоте.
Альтернативный подход к таблице сумм региона на GPU является рекурсивный (Hensley и др.. 2005 год). Обратитесь к этой публикации за полным описанием алгоритма. Статью также сопровождает реализация метода.
Одна известная проблема при дисперсии теневых карт является потенциальность для появления легких пучков света. Свет появляется в районах, которые должны быть полностью в тени. Этот артефакт, вы как правило, видели, когда мягкие края тени видны, как показано на Рисунке 8-6. На рисунке 8-7, самый нежелательный свет возникает, когда соотношение Da к Db велико.
Рисунок 8-6 Light Bleeding (нежелательный свет виден под дном фигуры)
Рисунок 8-7. Как образуется этот нежелательный свет (Light Bleeding)
Эта проблема не может быть полностью решена без принятия больших проб. Это справедливо для любого алгоритма, поскольку видимость большого региона, образуется пошаговой функцией.
Конечно, мы часто можем ускорить фильтрацию, используя разницу теневых карт, но желательно это делать с N-отличной фильтрацией для региона с N элементами. Любой алгоритм, который не выбирает все значения N, не может правильно восстановить функцию видимости, потому что идеальная функция имеет N уникальных произведений. В результате алгоритма отбора теневых карт, вычисление точного решения для фильтра регионов должно быть гибким.
Это требование неудобно, но тем не менее, разница карты теней на самом деле являются хорошими строительными блоками для точного и приближенного алгоритма оттенения. В первую очередь мы заинтересованы в сохранении высокой производительности, и готовы согласиться с некоторыми редкими физическими неточностями. Из приближенных алгоритмов, это возможно, наиболее перспективный подход.
Pmax может в значительной степени уменьшить появления света, ценой некоторого потемнения в полутёмных регионах.
Примерный алгоритм борьбы с нежелательным появлением света.
Важным замечанием является то, что часто из неравенств Чебышева получается, что поверхность никогда не достигает полной интенсивности.
Можно это исправить, изменив Pmax так, чтобы любые значения ниже определенных минимальных интенсивностей были нулями, а остальные значения единицами (при минимальной интенсивности).
Эта функция может быть сделана в HLSL так, как показано в листинг 8-3.
Пример 8-3. Снижение появления нежелательного света.
float linstep(float min, float max, float v)
{
return clamp((v – min) / (max – min), 0, 1);
}
float ReduceLightBleeding(float p_max, float Amount)
{
// Remove the [0, Amount] tail and linearly rescale (Amount, 1].
return linstep(Amount, 1, p_max);
}
Заметим, что linstep() может быть заменен на [0, 1]. Например, smoothstep() производит кубический спад функции, что может будет хорошо)
Суммируем параметры определяемых пучков света. Получаем масштабно-независимую сцену. Сцены с более легкими нежелательными появлениями света, как правило, требуют более высокой стоимости. Нужны оптимальные настройки, с отрегулированным соотношением источника и приемника света. Иногда следует повозиться с этим параметром, поскольку установление слишком высокого соотношения уменьшит детали тени. Соотношение должно быть установлено достаточно высоким для устранения наиболее нежелательных появлений света, сохраняя при этом как можно больше деталей.
На практике это решение эффективно работает подобно тому, как показано на рисунке 8-8. Уменьшение нежелательного появления света является гораздо более приоритетным, чем точность адаптивного алгоритма для приложений и игр.
Рисунок 8-8 Результаты после применения метода снижения нежелательного появления света (Light-Bleeding).
8.4.4 Числовая стабильность
Еще одна потенциальная проблема – это проблема числовой стабильности. К счастью, простым решением проблемы является использование 32-битной плавающей точки и фильтрации текстур, которые поддерживаются на картах серии GeForce 8.
Рекомендуется также использовать линейную метрическую глубину, а не «пост Z» прогноз. Последний метод имеет значительные потери точности. Эта потеря не может быть большой проблемой для сравнения на основе теневых карт процентно-приближенной фильтрацией, однако эти потери делают разницу вычислений нестабильной. Линейные метрики с более однородными измерениями (например, расстояние до источника света) являются более подходящими и стабильными.
В Листинге 8-4 приведен пример реализации метода с "расстоянием до источника света" глубины метрики на прожектор или на светящуюся точку.
Отметим, что глубина метрики может быть легко нормализованной на [0,1], если используется формат фиксированной точки теневой карты. Для направленного света "расстояние до светлой плоскости" является подходящей метрикой, и может быть получена из Z-оценки фрагмента в светлоё зоне. Кроме того, это значение Z может быть вычислено в вершинных шейдерах и безопасно интерполировано, а нелинейная length() функция в листинге 8-4 должна быть создана на каждый пиксель.
Мы уже видели немного не числовые проблемы со стабильностью, когда мы использовали линейные метрические глубины с 32-битной плавающей точкой.
Листинг 8-4. Использование Метрики линейной глубины для источника света
// Render variance shadow map from the light's point of view.
DepthPSIn Depth_VS(DepthVSIn In)
{
DepthPSIn Out;
Out.Position = mul(float4(In.Position, 1), g_WorldViewProjMatrix);
Out.PosView = mul(float4(In.Position, 1), g_WorldViewMatrix);
return Out;
}
float4 Depth_PS(DepthPSIn In) : SV_Target
{
float DistToLight = length(In.PosView);
return ComputeMoments(DistToLight);
}
// Render and shade the scene from the camera's point of view.
float4 Shading_PS(ShadingPSIn In) : SV_Target
{
// Compute the distance from the light to the current fragment.
float SurfaceDistToLight = length(g_LightPosition – In.PosWorld);
. . .
}
8.4.5 Реализация
На данный момент разница теневых карт обеспечивает эффективную фильтрацию, легко смягчает края тени, а также решает проблемы со смещением проблем стандартных теневых карт. Более того, реализация на сегодняшний день отлично подходит для использования в играх и других приложений реального времени.
Подводя итог, можем разделить теневые карты следующим образом:
- Рендеринг разницы теневых карт с помощью линейной глубинной метрики (Листинг 8-4), выводит глубину квадрата (Листинг 8-2). Использование мультисемплингова сглаживания (MSAA) на теневой карте (если это возможно).
- Опционально стирание разницы теневых карт с помощью разделяющего на блоки фильтра.
- Генерация множественного отображения как везможная теневая карта.
- Рендеринг сцены, проектирование текущего фрагмента в светлой зоне, как обычно, но с использованием одной, фильтрованной (анизотропная и трехцветная линейная) разницы в теневых картах для получения двух моментов.
- Использование неравенства Чебышева для вычисления Pmax (Листинг 8-1).
- При желании, применение уменьшения нежелательных появлений света с помощью Сmax (Листинг 8-3).
- Использование Pmax за счет вклада полутени.
Использование разницы теневых карт аналогично использованию нормальных теневых карт, за исключением того, что могут быть использованы размывание, мультисемплинг (multisampling) и фильтрации. Заметим, однако, что некоторые методы, используемые для стандартных карт теней (как, например, следующие методы) являются неприменимыми к разницам теневых карт:
- Использование метрик из предыдущих методов не будет работать в разнице теневых карт должным образом, поскольку восстановленные глубина распространения должна представлять собой глубину от ближайшей главной тени в светлой зоне. Это не является проблемой, однако, используется метод для второй глубины рендеринга чтобы избежать вопросов, которые можно решить непосредственно с разницей теневых карт (см. раздел 8.4.2).
- Рендеринг только в источниках (а не приемник) разницы карт теней неверно! Чтобы интерполяционная работала должным образом, на полученной поверхности должны быть представлены глубины распределения. Если это не так, то полутень будет неправильного размера и не плавно не перейдет со светлой на темную сторону.
Проекционная деформация и усечение разметки полностью совместимы с методом VSMs. Действительно, два метода дополняют друг друга. Разница теневые карты скрывает многие артефакты, полученные деформацией и усечением разметки. К тому же получается,что когда камера движется, скрываются разрывы между точками и тень плавает вдоль краев.
8.4.6 Разница Теневых карт. Смягчение тени.
Продвигаясь вперед, мы решаем несколько вопросов с помощью аппаратного фильтра. Во-первых, высоко качественные аппаратные фильтрации могут быть впринципе недоступны.
Как мы уже видели ранее, фиксация минимальной ширины фильтра смягчает тени краев. Предыдущие алгоритмы пользовались этой возможность, выбрав фильтр ширины динамическим, и основываясь на процессе "Блокировщик глубины". Такой подход может дать убедительную полутень, если расстояние между приемником и обьектом высоко.
К сожалению, мы не можем использовать для размывания фиксированную минимальную ширина фильтра в этом случае, потому что ширина изменений на пиксель считается на основе результатов фиксирования. Мы можем, безусловно, множественное отображать уровни о том, что аппаратные средства используются, но с использованием множественных отображений для размытия. Таким образом появляются крайне нежелательные квадратные артефакты, как показано на Рисунке 8-9. Существует несколько способов для получения более точных результатов: с помощью высокого фильтра вручную создать множественное отображение уровней, что является перспективным направлением для дальнейшей работы.
Рисунок 8-9 Box артефакты
Самое благоприятое обстоятельство это то что мы можем выбирать размер фильтра динамически на пиксель, как в идеале при постоянной стоимости и без динамического ветвления.
8.5 Сумма зон разницы теневых карт
Сумма зон в таблице была введена Crow 1984 для ускорения фильтрации текстур. При использовании источника текстуру с элементами A [I, J], мы можем построить сумму района в таблице т [I, J], с тем чтобы
Иными словами, каждый элемент является суммой всех элементов текстуры в прямоугольнике сверху и слева (или ниже). Рисунок 8-10 показывает пример некоторых произвольных данных, посчитанных по суммам.
Рисунок 8-10 Выборки данных и суммарных с ней суммарных зон таблицы
Сумма любой прямоугольной области может быть определена в постоянном
времени:
Мы можем легко вычислить среднее значение на этом регионе путем деления на количество пикселей в регионе. Билинейные интерполяции могут быть использованы при отборе проб в углах и производстве плавного градиента.
Заметим, что эта формула использует исключительно "max" стороны и "min" стороны прямоугольника. Если вычесть 1 из координат до поиска, то будет производиться болшая в соотношении min-inclusive/max-exclusive политика.
В примере из рис 8-10, мы можем вычислить сумму или среднее значение выделенного прямоугольника по данным опроса выделенного значения от "САТ" (в этом примере, рассматривали вычитание с обеих сторон для простоты). Это получается:
S = 28 - 8 - 6 + 2 = 16,
которое является правильной суммой свыше выделенною области данных. Деление на количество элементов в регионе (4) дает правильное среднее 4.
Суммарная таблица дает нам возможность выборки произвольных прямоугольных регионов, которые являются достаточными для наших целей. Они, однако, могут быть продлены до адаптивного образца не прямоугольных регионов (Glassner 1986).
8.5.1 Генерация Таблицы сумм региона
Мы хотим создать таблицу сумму региона на GPU для достижения лучшей производительности и чтобы избежать чрезмерных движений данных. Два алгоритма, в частности, являются потенциально подходящими: строковый и рекурсивный.
Строковый суммирует линию за линией, выполняя одну задачу. На GPU этого алгоритма могут быть реализовано, работая с одной строкой за раз, добавляя текущую строку с предыдущей сумме. Недостатком этого метода является то, что он требует проход по ширине и высоте.
Альтернативный подход к таблице сумм региона на GPU является рекурсивный (Hensley и др.. 2005 год). Обратитесь к этой публикации за полным описанием алгоритма. Статью также сопровождает реализация метода.
Комментариев нет:
Отправить комментарий