Gamedev LectureСтатьи

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

Автор:

[18:35] <CEMEH> Значит, предложение, впервые опубликованное в ShaderX...
[18:35] <CEMEH> Заключается в том, чтобы скинить нормали к треугольникам, а не вертексы.
[18:36] <CEMEH> Я сейчас приведу эту волшебную цитату :)
[18:36] <CEMEH> An inexpensive way to fix the variation in face normals across a face is to calculate skinning weights per face in addition to per vertex and use the face weights for the face normal.
[18:36] <CEMEH> This can be done by averaging all of the vertex weights or by extracting them directly from the original art. Using the same weight for each vertex of a face guarantees that the shadow volume can only be extruded along the edge quads.
[18:36] <CEMEH> Т.е. мы формируем веса, которые действуют на нормаль как усреднение весов вертексов.
[18:36] <CEMEH> В вершине два веса скиннинга - для нормалей и вершин.
[18:37] <CEMEH> Я писал эту математику на бумажке, она вшивая.
[18:37] <CEMEH> Т.е. результат не точен, а приближен.
[18:37] <CEMEH> Но оказывается, что если выполняются требования к замкнутости стенсельных контуров, то в реале результат удовлетворительный.
[18:37] <CEMEH> (сам не делал)
[18:38] <CEMEH> Если пойти на это, то можно и упрощенно скинить-находить контуры на CPU, и можно продолжать целиком считать на шейдере.
[18:38] <CEMEH> Есть какие-то вопросы по деталям?

[18:39] <CEMEH> [21:36] <cppguru> как это сочетается со сглаживанием нормалей?
[18:39] <CEMEH> Вот для стенсилей как раз не надо сглаживать нормали.
[18:39] <CEMEH> Нужно оперировать нормалью в треугольнике, а не в вертексе

[18:40] <CEMEH> [21:37] <Zeux> Где используется построение волюма на GPU?
[18:39] <CEMEH> [21:37] <Zeux> Где - комбинированный вариант?
[18:39] <CEMEH> За первое - слышал от многих. В частности, от xbox people.
[18:39] <CEMEH> На самом деле, если посмотреть на приставки, там очень много стенсилей.
[18:40] <CEMEH> В экшенах, гонках и вообще где тени бросает главный персонаж/объект.
[18:40] <CEMEH> Они там делают и еще более интересные трюки.
[18:40] <CEMEH> О которых я не могу рассказывать :)
[18:41] <CEMEH> Про частичные дегенераты - я и сам не знаю, где. Это скорее идея. Я бы так не стал делать.
[18:41] <CEMEH> Вообще, формат лекции - копилка трюков для медитации.
[18:41] <CEMEH> Прочитал, глядишь нашел и близкое.

[18:42] <CEMEH> Silhoette tracking для построение стенсилей.
[18:42] <CEMEH> Вот, наконец-то можно дать ссылку на пейпер
[18:42] <CEMEH> http://www.geocities.com/tom_j_hall/SilhouetteTracking.pdf
[18:43] <CEMEH> Это идея убыстрения алгоритма построения стенсилей на CPU.
[18:43] <CEMEH> Заключается в том, что если источник движется медленно, то силуэты прошлого раза не сильно отличаются от предыдущего.
[18:43] <CEMEH> Можно посмотреть на предыдущие и найти, где он сдвинулся на несколько треугольников.
[18:44] <CEMEH> Проблемы возникают с моментом создания новых кусков силуэтов, они преодолимы.
[18:44] <CEMEH> Т.е. экономия получается. Если источник двигается медленно, напомню.
[18:44] <CEMEH> Пейпер, впрочем, странный.
[18:44] <CEMEH> Потому что их оптимизированные цифры проигрывают моей brute-force реализации времен, когда я этим занимался.
[18:45] <CEMEH> Идея даст буст на больших детальных мешах.
[18:45] <CEMEH> Плохо живет со скиннингом, плохо с быстрыми перемещениями.
[18:45] <CEMEH> Пожалуй, и все про нее.

[18:45] <CEMEH> Далее, статическое упрощение волюмов.
[18:46] <CEMEH> Бывают случаи, когда волюмы не перестраиваются во время игры.
[18:46] <CEMEH> Ну там, стоит источник, и нужно бросать стенсельную тень от уровня.
[18:46] <CEMEH> В Doom3 так часто бывает.
[18:46] <CEMEH> Хочется их упрощать в препроцессе на предмет геометрии и филлрейт.
[18:46] <CEMEH> Т.е. выкинуть внутренние контуры, или укоротить их до пересечения с другими, более широкими.
[18:47] <CEMEH> Ясно, о чем идет речь?
[18:47] <CEMEH> Ну вот решение очень простое.
[18:47] <CEMEH> Достаточно провести для волюма CSG-операцию объединения.
[18:47] <CEMEH> Т.е. сделать бинарный +
[18:48] <CEMEH> Он выкинет всю внутреннюю геометрию, и получится идеально приспособленный для филлрейта волюм.
[18:48] <CEMEH> Мужики, скажите кто-нибудь, что понятно :_
[18:49] <CEMEH> Ну ладно, кому-то понятно, поехали дальше.

[18:49] <CEMEH> [21:47] <_VirT_> как влияет стенсил на филрейт? не понятно.
[18:50] <CEMEH> Ну, это обычная проблема алгоритма.
[18:50] <CEMEH> Каждый контур становится очень длинной геометрией, которая занимает много места на экране.
[18:50] <CEMEH> Для сложных объектов овердроу может достигать 30 и больше.
[18:50] <CEMEH> Это огромные затраты филлрейт, и это основная проблема производительности стенсилей.
[18:51] <CEMEH> Впрочем, мягкие стенсили жрут больше :)

[18:51] <CEMEH> [21:49] <_VirT_> стоит ли тогда делать сортировку полигонов? Z pass only?
[18:51] <CEMEH> Не спасет. Они не отсекаются zbuffer'ом, они все должны отрисоваться и внести свой вклад.

[18:49] <CEMEH> Значит, о мягких стенсил-тенях.
[18:53] <CEMEH> Для мягких стеселей, кроме уже упомянутого fullscreen blur можно делать...
[18:53] <CEMEH> Совершенно тупой метод с размножением на 100 отдельных источников :)
[18:54] <CEMEH> Ну т.е. 100 источников рядом, вместо одного.
[18:54] <CEMEH> Смерть филлрейту, жизни на земле, fps'у и деньгам девелоперов.
[18:54] <CEMEH> Кажется, fear так умел делать в демке.
[18:54] <CEMEH> Тормозило от души.
[18:54] <CEMEH> Но вообще - никто не делает.
[18:55] <CEMEH> Другой вариант, чуть лучше - так называемые wedges
[18:55] <CEMEH> [21:53] <_NexiliaN_> заметка: в самой игре )
[18:55] <CEMEH> Вот, оказывается, fear не только в демке так делает :)
[18:55] <CEMEH> http://citeseer.ist.psu.edu/assarsson03optimized.html
[18:55] <CEMEH> Это линк на статью уже оптимизированного алгоритма wedges.
[18:55] <CEMEH> Он не сказать, что сильно оптимизирован.
[18:55] <CEMEH> Значит, в чем основная идея.
[18:56] <CEMEH> Сначала рисуется обычный стенсиль, жесткий как вся наша жизнь.
[18:56] <CEMEH> А потом - рисуется особая геометрия, чтобы пометить места penumbra, т.е. полутеней.
[18:57] <CEMEH> Эта геометрия выглядит, как конусы, рожденные из силуэтного ребра.
[18:57] <CEMEH> Т.е. представьте себе, что мы из каждой вершины силуэтоного ребра выпустили конус и соединили их в одну пирамиду, чтоли.
[18:58] <CEMEH> Мы рисуем для каждого ребра такую пирамиду, и для каждого пикселя сцены, попавшего в нее, вычисляем сколько источника через нее видно.
[18:58] <CEMEH> Исключительно аналитически.
[18:58] <CEMEH> Т.е. зная радиус источника и положение внутри penumbra, вычисляем сколько его видно.
[18:59] <CEMEH> Решается квадратное уравнение в pixel shader и т.д.
[18:59] <CEMEH> В общем, это очень дорого, на самом деле.
[18:59] <CEMEH> Каждое силэтное ребро становится пирамидой, т.е. еще больше чем обычно, и в пирамиде сложный пиксельный шейдер.
[18:59] <CEMEH> Выглядит, впрочем, это все очень круто.
[19:00] <CEMEH> Есть зависимость от расстояния до окклудера, от размера источника, от всего-всего.
[19:00] <CEMEH> В пейпере рассмотрены всякие оптимизации, в духе более компактного построение пирамиды, помечания стенсилем мест, которые в penumbra region и т.д.
[19:01] <CEMEH> Это самая мощная надежда стенсилей на мягкость.
[19:01] <CEMEH> Очень дорогая, но не безумно дорогая.
[19:01] <CEMEH> Т.е. есть демки с простыми сценами > 20 fps :)

[19:02] <CEMEH> [22:00] <Zeux> Имеется в виду честная мягкость as opposed to обычный блур?
[19:02] <CEMEH> [22:00] <Zeux> ну, почти честная
[19:02] <CEMEH> Да, они очень близки к честности.

[19:03] <CEMEH> Немного о будущем, т.е о SM4.
[19:03] <CEMEH> В SM4 будет geometric shader, а значит построение shadow volume на GPU.
[19:03] <CEMEH> Уже честного, без denerate quad
[19:04] <CEMEH> Видимо, будет возможным и построение wedges.
[19:04] <CEMEH> На первый взгляд ;)
[19:04] <CEMEH> Вот и все, что клевого в близком будущем.

[19:04] <CEMEH> [22:02] <_NexiliaN_> тоесть в penumbra регионе мы в rgb записываем дистанцию до окколудера?
[19:05] <CEMEH> Нет, не дистанцию, а именно процент видимости источника из этой точки.
[19:05] <CEMEH> Т.е. в чистом виде мягкость тени.
[19:05] <CEMEH> Как если бы он загораживался только этой пирамидой.

[19:05] <CEMEH> Да, еще один трюк.
[19:05] <CEMEH> Вот нынче стали популярны бамп-техники.
[19:05] <CEMEH> Параллакс и иже с ним.
[19:06] <CEMEH> Обидно, что стенсили напрямую не получают забампленную тень.
[19:06] <CEMEH> Т.е. что тень остается ровной.
[19:06] <CEMEH> Между прочим, это один из очень немногих способов обнаружить, что в FEAR в выбоинах на стенах таки параллакс :)
[19:07] <CEMEH> Demiurg-HG с #gamedev предложил выход.
[19:07] <CEMEH> Можно в pixel shader писать правильный oDepth на выходе, который учитывает бамп.
[19:08] <CEMEH> Так как стенсили работают только со значениями в zbuffer, то бамп становится и в затенении.
[19:08] <CEMEH> Это обидно тем, что нужно писать в шейдере depth.
[19:08] <CEMEH> Но тем не менее как вариант остается.

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

21 февраля 2006

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