forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Уроки (http://forum.boolean.name/forumdisplay.php?f=145)
-   -   "Лесенки" на границе Shadow distance (http://forum.boolean.name/showthread.php?t=13852)

Taugeshtu 07.12.2010 16:17

"Лесенки" на границе Shadow distance
 
Вложений: 1
Предисловие:
По мере возможностей своего медленного интернета облазил ветки "глюки", "tips&tricks", шейдерный флуд, Post-Processing соседнего ресурса, но ничего похожего на свой вопрос не нашел.
На официальных форумах и "ответах" тоже был, но решения там тоже не увидел. Если плохо искал - просьба ткнуть в меня ссылкой на решение (именно в решение).

Проблема:
Есть сцена, включен deferred, в сцене directional источник света с мягкими тенями. Лайтмапы посчитаны, расстояние теням в "quality settings" выставлено 30. В дальней зоне теней (т.е. ближе к shadow distance) появляются "лесенки" - плоскости затенения. При поворотах камеры и при движении "лесенки" тоже бегают - как я понимаю, зависят они от depth пикселя.
Ну, на скриншоте эффект в общем-то во всей "красе" представлен.

Задача:
Заставить их исчезнуть.

Информация:
Как я понял из официальных форумов, это нечто вроде "особенности", которую на уровне движка они выпилить не могут (что меня сильно удивляет - неужели с ТАКИМ артефактом они готовы мириться?)

Попытки решения:
1. Пробовал крутить Far clip plane камеры. Лесенкам пофиг.
2. Пробовал уменьшать Shadow distance. На SD=10 лесенок почти не видно, но SD=10 - это 3 метра в игровом эквиваленте. Несерьёзно, однако. Идешь-идешь, и тут ЧЕРДАК! - под объектом тень появилась.
3. Пробовал крутить Bias параметр у теней источника света. Чем меньше Bias, тем ужаснее лесенки. Но! Я сильно обломался когда напоролся на то, что ребята из Юнитека решили, что Bias больше чем 0.2 быть не может. Думается мне, если бы его можно было установить 0.7 - 0.9, это решило бы проблему. В 2.6, к слову, когда у меня возникала подобная проблема (там лесенки были менее ужасными и проявляли себя всего в паре мест), я выкручивал Bias до значения 1.0 и избавлялся от артефакта.

!!Решение!!
Крутить вместе Far clip plane и (этот еще важнее) Near clip plane. Старайтесь сделать Near clip plane настолько большим, насколько это возможно - и лесенки уходят! Но! Уходят лесенки только в Play mode, в Scene view они остаются(

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

.Squid 07.12.2010 18:03

Ответ: "Лесенки" на границе Shadow distance
 
Сразу глянув на скрин, хотел предложить покрутить depth bias. Но потом оказалось, что ты уже это делал.
Вообще соотношение far clip plane к near clip plane всегда нужно делать как можно меньше. Это повышает точность буфера глубины. Вспоминается какой-то пост в блоге Aras'a, что неплохо было бы сделать автоответчик на форуме, который бы писал "Следует увеличить значение near clip plane", ибо это какая-то массовая истерия ставить ближнюю плоскость на 0.000001, а дальнюю на 1000000. В таком случае, если буфер глубины 24-битный, то на один его бит будет приходиться 59604,64 единиц движкового пространства. Но это очень грубо говоря, т.к. значения глубины в з-буфере на самом деле не линейные. Скажем, если соотношение far к near составляет 100 единиц, то 90% значений з-буфера придется на первые 10% значений глубины сцены. Именно поэтому такие артефакты чаще всего проявляются на большем расстоянии от камеры. Есть еще w-buffer, он вроде как линейный. Но о нем я ничего больше сказать не могу, т.к. не пользовался.
Иногда похожая ерунда может возникнуть если тень падает на поверхность под очень острым углом.

UPD. Немного перефразировал и дополнил.

ABTOMAT 07.12.2010 18:59

Ответ: "Лесенки" на границе Shadow distance
 
Цитата:

это какая-то массовая истерия ставить ближнюю плоскость на 0.000001, а дальнюю на 1000000.
Ну дак это логично, мне кажется. Когда-то давно, когда я впервые столкнулся с тем, что мне блиц красил чёрным то, что вдали, я узнал про эту команду и, недолго думая, засунул туда 0.000001 и 9999999 шоб надолго хватило, искренне удивляясь, почему авторы движка так не сделали, вдалеке не видно ж ничего.
Только потом уже узнал в чём соль.

pax 07.12.2010 19:07

Ответ: "Лесенки" на границе Shadow distance
 
Цитата:

Сообщение от .Squid (Сообщение 171269)
Есть еще w-buffer, он вроде как линейный. Но о нем я ничего больше сказать не могу, т.к. не пользовался.

А он по моему только на 16-ти битном цвете дает лучший результат. Когда-то давно интересовался, а вот осталось в голове только это.

.Squid 07.12.2010 19:51

Ответ: "Лесенки" на границе Shadow distance
 
Цитата:

Сообщение от pax (Сообщение 171283)
А он по моему только на 16-ти битном цвете дает лучший результат. Когда-то давно интересовался, а вот осталось в голове только это.

Цвет тут не при чем. W-buffer давал более качетсвенный результат, чем 16-битный Z-buffer. Почему сейчас, в эпоху 24-, 32-битных з-буферов, он дает хуже результат, я не знаю, т.к. не в курсе всех нюансов его работы. Сейчас W-buffer железом не поддерживается, насколько я знаю.

pax 07.12.2010 20:37

Ответ: "Лесенки" на границе Shadow distance
 
Собственно о возможности использования более точного w-буфера при 16-ти битном цвете я и не догадывался. Так что я это и имел ввиду.

.Squid 07.12.2010 21:37

Ответ: "Лесенки" на границе Shadow distance
 
Еще раз говорю: разрядность цвета тут не при чем. Разрядность з-буффера устанавливается отдельно.


Часовой пояс GMT +4, время: 01:53.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot