2013-07-08 2 views
0

Я пытаюсь создать объект с самозатенением (opengl/glsl). Шаги, которые я сделал были таковы:теневые карты, трюк woo, пилинг глубины

1- Визуализируйте сцену от света, чтобы получить карты глубины

2- Render от положения камеры и рассчитать расстояние от каждой точки к источнику света, если расстояние от точка на свет больше глубины, хранящейся на карте глубины, точка находится в тени.

, но затем возникает проблема теневых угрей. поэтому второй шаг будет выглядеть так:

2- ... if (abs (DISTANCE_OF_THE_POINT_TO_LIGHT - DEPTH_STORED_IN_THE_DEPTH_MAP)> BIAS) точка находится в тени.

но все же это не дает мне хороших результатов (нет подходящего значения смещения).

Итак, я применил трюк woo (найдя первую и вторую поверхности из света, а затем сохранил среднюю точку в буфере глубины). Для этого я сделал двухпроходную глубину пилинга. Этапы:

1- Извлеките сцену из света, чтобы получить карту глубины, как обычно.

2 - Извлеките сцену из света, чтобы получить карту глубины 2, если расстояние до точки света равно расстоянию на карте 1-й глубины, отбросьте такую ​​точку (то есть не отрисуйте первую слой).

3- Магазин в качестве окончательной карты глубины (первая карта глубины + 2-я карта глубины)/2

4- Рендер от положения камеры и рассчитать расстояние от каждой точки к источнику света, если расстояние от точка на свет больше глубины, хранящейся на карте глубины, точка находится в тени.

проблема возникает сейчас на шаге 2, той же самой проблемой, с которой мы столкнулись раньше: когда первый и второй уровни близки, появляются ошибки округления и появляется какая-то акне, и нет подходящего значения смещения. , так что я не получаю никакой пользы от алгоритма woo, он просто перемещает проблему на часть шероховатости.

как вы можете это решить?

+0

Я никогда не слышал трюк woo. Джон Кармак предложил подобный трюк много лет назад, используя переднее лицо, а затем обратную визуализацию лица вместо глубинного пилинга. –

ответ

0

Я получаю выгоду от алгоритма woo, он просто перемещает проблему на часть шероховатости.

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

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

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

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

Предложение, чтобы улучшить свои результаты:

Убедитесь, что DEPTH_STORED_IN_THE_DEPTH_MAP вычисляется точно так же, как DISTANCE_OF_THE_POINT_TO_LIGHT. Обратите особое внимание на скрытую фиксированную арифметику трубопровода. Либо используйте их как для DEPTH_STORED_IN_THE_DEPTH_MAP, так и для DISTANCE_OF_THE_POINT_TO_LIGHT или никогда не используйте их.

Используйте 32-битные текстуры с плавающей точкой для хранения глубины.

Пробовать процентный фильтр ближе к PCF.

Глубинный пилинг дает вам адаптивный BIAS. Вы также можете иметь адаптивное разрешение: Cascaded Shadow Maps.

Смежные вопросы