Gamedev LectureСтатьи

Лекция #15. Тени - tips & tricks. [Лектор - Семен] (4 стр)

Автор:

[19:44] <CEMEH> Теперь о более традиционных способах размытия shadow map.
[19:44] <CEMEH> Все знают, что это PCF - Percentage Closest Filtering
[19:45] <CEMEH> Т.е. взять несколько сэмплов, сравнить, усреднить результат, записать.
[19:45] <CEMEH> Вон UE3 пользует 4x4 kernel.
[19:45] <CEMEH> Значит, какие можно делать усовершенствования.
[19:45] <CEMEH> Во-первых, можно не просто усреднять, а эмулировать билинейную филтрацию.
[19:45] <CEMEH> Т.е. усреднять не с фиксированными весами, а с frac (tu*tex_size)
[19:46] <CEMEH> frac - взятие дробной части
[19:46] <CEMEH> [22:44] <Filippok> поясни, чё за 4х4 кернел
[19:46] <CEMEH> Ну просто линейный фильтр, который усредняет в границе двух текселей.
[19:46] <CEMEH> 16 значений, которые смешиваются.
[19:46] <CEMEH> Вот так делает глубокоуважемый Шодан, который не стал слушать :)
[19:47] <CEMEH> Еще лучше предлагает делать Д. Кармак в своем последнем отжыге на Quakecon.
[19:47] <CEMEH> [22:45] <_NexiliaN_> 4x4 затенения? тоесть стравнение?
[19:47] <CEMEH> Да, 16 сравнений, а потом усреднение результатов.
[19:48] <CEMEH> И 16 сэмплирований текстуры, конечно.
[19:48] <CEMEH> [22:46] <_NexiliaN_> в смысле в шадере разчитываем освезение - потом 4x4 шадов средние и множим на свет?
[19:48] <CEMEH> Да.
[19:49] <CEMEH> Так вот, Кармак предлагал зашумлять коэффициенты усреднения.
[19:49] <CEMEH> Это интересная идея. Мы добавляем осмысленные высокие частоты к вычислению значения.
[19:49] <CEMEH> Это сильнее прячет алиасинг.
[19:49] <CEMEH> Ровно так же, как detail texture + base texture в обычных техниках текстурирования.
[19:49] <CEMEH> Эффект меньше, так как картинка затенения 0-1 и потому очень контрастна, но все равно.
[19:50] <CEMEH> Можно тупо очень затайлить маленькую текстуру, из которой брать коэффициенты, например.
[19:50] <CEMEH> [22:48] <_NexiliaN_> а можно както учитиывать удалённость от кастера ? и менять коофициент delta?
[19:50] <CEMEH> Да, конечно.
[19:51] <CEMEH> Можно находить разницу между значением в shadow map и самой точкой, и от этого увеличивать радиус или коэффициент блура.
[19:51] <CEMEH> Эта тривиальная идея стала темой последнего вайтпейпера NV по теням :)
[19:51] <CEMEH> http://download.nvidia.com/developer/presentations/2005/SIGGRAPH/PCSS.pdf
[19:51] <CEMEH> Там есть еще один интересный трюк.
[19:51] <CEMEH> Можно использовать dynamic branching в pixel shader для оптимизации.
[19:52] <CEMEH> Т.е. засэмплить 4 далеких сэмпла. Если они все в тени или все снаружи - ничего не делаем.
[19:52] <CEMEH> И только если мы в penumbra - запускаем тяжелый фильтр.
[19:52] <CEMEH> dynamic branch дает выигрыш.

[19:54] <CEMEH> Чтобы расслабиться, давайте несложный трюк.
[19:55] <CEMEH> Если в кадре много статики, и динамики, и камера медленная  - можно статику рисовать только при изменении положения камеры.
[19:55] <CEMEH> Т.е. отрисовать статику, запомнить в отдельном shadow map.
[19:55] <CEMEH> И каждый кадр в нее только дорисовывать динамику.
[19:55] <CEMEH> В случае какой-нибудь RTS может и повысить средний fps.
[19:56] <CEMEH> Вот и все :)

[19:56] <CEMEH> Про поддержку parallax и прочего.
[19:56] <CEMEH> Она в shadow map достигается прозрачно. Сдвигаешь вместе с текстурными координатами обычной текстуры, и координаты shadow map.
[19:57] <CEMEH> И все в порядке, тень от shadow map тоже параллаксится.

[19:57] <CEMEH> [22:55] <_NexiliaN_> а как эффективно кобинировать статический shadowmap и динамический от отдного источника?
[19:57] <CEMEH> Да очень просто. Рисуешь в статический динамику каждый кадр.
[19:57] <CEMEH> И его пользуешь.

[19:58] <CEMEH> [22:55] <Qiller> Можно еще кратенько про тени от полупрозрачных объектов? Например ссылки куда смотреть
[19:58] <CEMEH> Все фигово с полупрозрачными объектами.
[19:58] <CEMEH> Для фейка - можно в отдельный канал shadow map рисовать эту яркость.
[19:58] <CEMEH> Но она будет одна на всех объектах, попавших в слой.
[19:59] <CEMEH> Можно пытаться запоминать несколько прозрачностей и глубин в слое, но это дорого.
[19:59] <CEMEH> В общем, непонятно что делать. В случае одного слоя прозрачности - все просто, в общем - все плохо
[19:59] <CEMEH> Но есть надежда, что можно ограничиться четырьмя, скажем :)

[19:59] <CEMEH> [22:56] <_NexiliaN_> а если статика довольно точно потчитана - и это требует разных проходов или методик
[19:59] <CEMEH> [22:56] <_NexiliaN_> а примеру от мира sm - а от персонажа одного своя psm
[19:59] <CEMEH> По-видимому, только перемножать резултьтаты в pixel shader. Или использовать разные для разных объектов.
[20:00] <CEMEH> Когда я буду говорить о Cascaded SM, мы к этому вернемся

[20:02] <CEMEH> Давайте про биас, краткий гуидлайн.
[20:02] <CEMEH> Итак, basic tecniques
[20:02] <CEMEH> 1. Попробовать обычный depth bias
[20:02] <CEMEH> 2. Попробовать polygon offset, если у вас depth textures от NV
[20:03] <CEMEH> Если не depth textures, то его можно эмулировать через градиентные инструкции.
[20:03] <CEMEH> polygon offset (он же slopescale bias) - очень мощная и умная штука.
[20:04] <CEMEH> Она учитывает градиент значений в zb для треугольника, что обычно самое то.
[20:04] <CEMEH> [22:52] <_NexiliaN_> как меняется bias от угла нормали?
[20:04] <CEMEH> Вот такой биас это учитывает.
[20:04] <CEMEH> 3. Попробовать рисовать back culled объекты в shadow map
[20:04] <CEMEH> Т.е. чтобы был слепок глубины дальней половины объекта.
[20:05] <CEMEH> 4. Добавить коэффциент от dot (normal*light)
[20:05] <CEMEH> 5. Сделать пост-процесс, который выбирает максимальное значение из соседних сэмплов, и работать с ним.

[20:06] <CEMEH> [23:03] <Qiller> Значение биаса от карточки может зависеть?
[20:06] <CEMEH> В D3D8 был бардак, в D3D9 уже все более-менее униформно.
[20:06] <CEMEH> Т.е. предполагается, что да, и если нет - то это баг.

[20:06] <CEMEH> 6. Попробовать plane-map shadows
[20:06] <CEMEH> http://dev.dtf.ru/articles/read.php?id=37761
[20:07] <CEMEH> sav их придумал.
[20:07] <CEMEH> За недостатки я уже писал на форуме.
[20:07] <CEMEH> 7. Попробовать ту страшную траву, которую я писал в статье в GPU Gems.
[20:08] <CEMEH> Она дешевая по производительности, но очень затратная на тюнинге.
[20:08] <CEMEH> Этот список отсортирован по степени отчаяния.
[20:08] <CEMEH> Для неперспективных теней обычно уже на втором шаге проблемы кончаются.
[20:09] <CEMEH> Максимум на третьем.
[20:09] <CEMEH> В TSM предлагается термоядерный метод аж с дополнительным лукапом.
[20:09] <CEMEH> А рядом - фейковый. Который может и зажить до определенной сложности сцены

[20:09] <CEMEH> [23:07] <_NexiliaN_> а как эффективо мыть sm ? или только куб ждитеров?
[20:10] <CEMEH> Если мыть - это мягкость, то PCF и smoothies надо смотреть.
[20:10] <CEMEH> [23:08] <_NexiliaN_> я про *cube
[20:11] <CEMEH> Видимо, действительно jitter'ом вектора направления.
[20:11] <CEMEH> Т.е. такие более сложные сдвиги для сэмплов, участвующих в PCF

[20:10] <CEMEH> [23:07] <Zeux> где можно найти пост про недостатки на форуме?
[20:10] <CEMEH> http://www.gamedev.ru/forum/?group=2&topic=1652

[20:12] <CEMEH> [23:10] <_NexiliaN_> насколько эффективно юзать дуал параболик? и вообще реально?
[20:13] <CEMEH> Ну, основная проблема понятно в чем - в том, что требуется нехилая тесселяция геометрии, и в том, что алиасинг неравномерен.
[20:13] <CEMEH> Мне лично не нравится метод. Лучше уж классический cubemap

[20:15] <CEMEH> Вот мне тут добавляют.
[20:15] <CEMEH> [23:12] <ZFail> еще NV_DEPTH_CLAMP как средство борьбы с биасом
[20:15] <CEMEH> [23:12] <CEMEH> Ы?
[20:15] <CEMEH> [23:12] <CEMEH> Средство повышения точности?
[20:15] <CEMEH> [23:12] <ZFail> да
[20:15] <CEMEH> Да, есть такая маза.
[20:15] <CEMEH> [23:13] <ZFail> или его эмуляция в VS ля DX
[20:15] <CEMEH> [23:13] <ZFail> я попробовал, вполне катит даже
[20:16] <CEMEH> Может, и будет катить. Но метод неточен и вполне может вызвать артефакты.

[20:14] <CEMEH> Дальше у меня Cascaded Shadow Maps
[20:14] <CEMEH> Значит, это альтернативный PSM метод борьбы с алиасингом.
[20:14] <CEMEH> Давний пейпер назывался Adaptive Shadow Maps
[20:14] <CEMEH> Идея в том, чтобы использовать много разных shadow map, а не один большой на все
[20:16] <CEMEH> Сделать много разных shadow map, которые детальнее вблизи и менее детальны вдали.
[20:16] <CEMEH> Это основная идея.
[20:17] <CEMEH> Вот известный мужик Tom F. писал о своих фантазиях на эту тему.
[20:17] <CEMEH> http://home.comcast.net/~tom_forsyth/papers/shadowbuffer_pseudocode.html
[20:17] <CEMEH> У него идея в том, чтобы все объекты порастолкать по разным shadow viewer'ам, и оценить плотность текселей на них метрикой ошибки.
[20:17] <CEMEH> Стала ошибка большая - сделали несколько shadow viewer'ов.
[20:18] <CEMEH> После того как распределили - отрендеряли их в разные текстуры и наложили пачкой.
[20:18] <CEMEH> Важный момент - как накладывать пачкой.
[20:18] <CEMEH> Можно выбирать между текстурами в pixel shader.
[20:18] <CEMEH> Можно рендерять геометрию несколько раз, с отдельными текстурами.
[20:18] <CEMEH> Первый метод обычно лучше.

Страницы: 1 2 3 4 5 6 Следующая »

21 февраля 2006

Комментарии [2]