Gamedev LectureСтатьи

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

Автор:

Disclaimer: лог почищен, некоторые посты передвинуты, некоторые опечатки поправлены. полный лог

[18:03] <CEMEH> Значит, немного о формате лекции.
[18:03] <CEMEH> Я спрашивал на канале, и большей частью народ был за второй вариант.
[18:03] <CEMEH> Так как мне он самому больше всего интересен, я попытаюсь так и читать.
[18:04] <CEMEH> Т.е. в без обсуждений базовых алгоритмов, а попытаюсь как-то пробежаться о трюках и дополнениях, которые были за последние года два.
[18:04] <CEMEH> Наверняка, что-то забуду и упущу, так что не обессудьте.
[18:04] <CEMEH> Будет много ликнов на пейперы :)
[18:04] <CEMEH> С кратким их изложением.
[18:05] <CEMEH> Большую часть трюков наверняка многие знают, но судя по тому, что я скучно рассказываю о них который год, надо собрать в одном месте.
[18:05] <CEMEH> Итак, основные части:
[18:05] <CEMEH> 1) Стенсили
[18:05] <CEMEH> 2) Shadow map
[18:05] <CEMEH> 3) PRT
[18:05] <CEMEH> 4) Разное
[18:05] <CEMEH> 5) Философия и подведение итогов
[18:05] <CEMEH> Если будет плохо понятно - спрашивайте больше, а то я могу слишком кратко рассказывать.
[18:06] <CEMEH> Есть вопросы по организации?

[18:07] <shodan> где статья в GPUG2!
[18:07] <CEMEH> shodan, это последний пункт :)

[18:07] <CEMEH> Итак, стенсили.
[18:07] <CEMEH> Для разминки давайте попинаем Doom3-подход.
[18:08] <CEMEH> Стенсили любят ругать за то, что каждый источник требует прохода.
[18:08] <CEMEH> Отрисовали тень от одного источника в стенсил, отрисовали сцену с освещением от этого источника и стенсил-тестом.
[18:08] <CEMEH> Классический Doom3.
[18:08] <CEMEH> Источников много - проходов становится тоже.
[18:09] <CEMEH> Что на самом деле можно делать.
[18:09] <CEMEH> Можно рендерять стенсили отдельно в отдельную RT.
[18:09] <CEMEH> В каждый цветовой канал - тень от одного источника.
[18:09] <CEMEH> В r - одна, в g - другая и т.д.
[18:10] <CEMEH> Имея такую текстуру, можно накладывать сразу 4 источника за проход. Имея две текстуры - все 8.
[18:10] <CEMEH> Но обычно 4 достаточно.
[18:10] <CEMEH> Дополнительные приемущества - эта RT может быть уменьшенного разрешения, экономя важный для стенселей филлрейт.
[18:10] <CEMEH> Скажем, раза в 2 по каждой оси - уже 4 раза.
[18:10] <CEMEH> Это _очень_ много.
[18:10] <CEMEH> Кроме того, эту текстуру можно мыть.
[18:10] <CEMEH> Блуром, параллельным сразу для 4 каналов.
[18:11] <CEMEH> Все знают как мыть гауссом через пинг-понг? :)
[18:11] <CEMEH> Вопросы можно приватом.
[18:11] <CEMEH> Ага, вопросы есть.
[18:11] <CEMEH> Значит, пинг-понг - это когда рендеряют в из одной текстуры в другую туда-обратно.
[18:12] <CEMEH> В случае блура это эффективно делать следующим образом.
[18:12] <CEMEH> Исходную текстуру рендеряем в промежуточный RT, взвешивая несколько сэмплов с вертикальным сдвигом текстурных координат.
[18:12] <CEMEH> Разницей на тексель-полтекселя.
[18:12] <CEMEH> И усредняем их тупо с гауссовыми весами.
[18:13] <CEMEH> Из этой промежуточной RT рендеряем в финальную, с сдвигами сэмплов по горизонтали.
[18:13] <CEMEH> Таким образом, мы на самом деле усреднили по квадратному региону.
[18:13] <CEMEH> Если 4x4 обычным способом бы заняло 16 сэмлов, то пинг-понгом - всего 8.
[18:13] <CEMEH> 4 за один проход, и 4 за второй.
[18:14] <CEMEH> Это очень эффективный метод делать пост-процессы.
[18:14] <CEMEH> Вопросы остались?
[18:14] <CEMEH> Отлично.
[18:14] <CEMEH> Так вот, эту текстуру можно блурить, 4 источника за раз.
[18:14] <CEMEH> Это как-бы анти-depth of field
[18:14] <CEMEH> Чем дальше сэмпл, тем меньше радиус блура.
[18:15] <CEMEH> И нужно все также как в depth of field учитывать разность по z соседних пикселей.
[18:15] <CEMEH> Чтобы тени от близкой стены не наползали на воздух.
[18:15] <CEMEH> Так мыть можно и shadow map, кстати.
[18:16] <CEMEH> После этого накладываются 4 источника за проход, где в pixel shader сэмплится эта самая помытая текстура. Она накладывается напрямую на экран.
[18:16] <CEMEH> Если нет вопросов, давайте двигаться к следующему трюку.
[18:16] <CEMEH> [21:14] <aruslan> где нибудь этот трик уже юзался?
[18:17] <CEMEH> Такой блур делали в Chronicles of Riddick, как все знают
[18:17] <CEMEH> Именно сам подход - не знаю, честно. Но знаю, что рассказывал и говорили - блин, надо было так.
[18:18] <CEMEH> Кармаку, впрочем, не рассказывал :)
[18:17] <CEMEH> [21:14] <_NexiliaN_> имеется в виду r * свет1 + g * свет2 ?
[18:17] <CEMEH> Да, именно.
[18:18] <CEMEH> Ок, поехали дальше.

[18:18] <CEMEH> Следующий трюк - избавление от тривиальных затенений в стенсилях.
[18:19] <CEMEH> Это известная проблема. Если сделать стенсили обычным способом, то граница затененной области видна очень сильно.
[18:19] <CEMEH> Потому что волюм идет ровно по ребрам, и они резко становятся темнее.
[18:19] <CEMEH> Это можно бороть, скажем, темным диффузом, который на этих ребрах уже 0.
[18:19] <CEMEH> Становится все темнее, но вместе с тем и хоррорнее! %)
[18:20] <CEMEH> В свое время именно для борьбы с этим артефактом Петя изобретал свои гладкие волюмы, о которых рассказано в моей статье.
[18:20] <CEMEH> Проблема именно в тривиальных затенениях.
[18:20] <CEMEH> Т.е. волюмы затеняют back-faced грани, которые и так понятно, что темные
[18:21] <CEMEH> [21:18] <viv_> Эти гладкие волюмы нашли практическое применение ? то есть есть реально работающие реализации?
[18:21] <CEMEH> Нет :)
[18:21] <CEMEH> Именно потому что есть трюк, о котором я рассказываю.
[18:21] <CEMEH> Так вот, идея такая.
[18:21] <CEMEH> Можно строить шапку волюма не на front-faced, а на back-faced гранях.
[18:21] <CEMEH> Т.е. передняя шапка - на гранях, которые темные для источника.
[18:22] <CEMEH> После того как волюм построен так - он целиком вне объекта.
[18:22] <CEMEH> Точнее, вне задних граней. на которых проблема.
[18:22] <CEMEH> Ну, может еще надо немножко отодвинуть его назад :)
[18:22] <CEMEH> После этого тривиальных затенений больше нет.
[18:22] <CEMEH> Есть только действительно места, где одни части объекта затеняют другие.
[18:23] <CEMEH> И проблема решается сама собой.
[18:23] <CEMEH> Еще один плюс такого подхода - в том, что это позволяет делать LOD геометрии shadow volume.
[18:24] <CEMEH> Кто пробовал упрощать теневую геометрию, сохраняя самозатенение - поймет о чем я.
[18:24] <CEMEH> Как только геометрия для построение shadow volume разошлась с оригинальной - начинается полная колбаса.
[18:24] <CEMEH> Т.е. страшные визуальные артефакты.
[18:24] <CEMEH> Потому что грани начинают пересекаться внутри объекта.
[18:25] <CEMEH> Если же shadow volume целиком вне объекта, и LOD увеличивает модельку только "вширь", то все в порядке.
[18:25] <CEMEH> Конечно, в ограниченных пределах, но раза в два поликаунт можно снизить.

[18:26] <_VirT_> этот трюк описан в статье или я что-то путаю?
[18:26] <CEMEH> Нет.

[18:27] <CEMEH> Рассказывать ли про построение shadow volume целиком на GPU (как описано в статье)?
[18:27] <CEMEH> Ок, вкратце.
[18:28] <CEMEH> Значит, есть возможность целиком строить shadow volume на GPU.
[18:28] <CEMEH> Это описано в статье http://www.gamedev.ru/articles/?id=30115
[18:28] <CEMEH> Идея в том, чтобы в каждое ребро модельки воткнуть degenerate quad, который при определенных условиях превращается в стенку волюма.
[18:29] <CEMEH> Для этого каждая вершина размножается по каждому треугольнику, в котором она лежит.
[18:29] <CEMEH> В каждой размноженной вершине - своя нормаль (соотв. треугольнику)
[18:29] <CEMEH> И ребра соединены квадом.
[18:29] <CEMEH> В статье на третьей странице картинки.
[18:30] <CEMEH> В шейдере мы в зависимости от знака dot (light, normal) либо оставляем точку на месте, либо протягиваем по направлению источника.
[18:30] <CEMEH> Получается, что front cap остается на месте, back cap - улетает далеко, а degenerate quads между ними превращаются в стенки волюма.
[18:31] <CEMEH> Значит, маленькое дополнение, которого нет в статье.
[18:31] <CEMEH> На самом деле, в принципе можно вообще не париться.
[18:31] <CEMEH> А просто вытягивать в начальной модели в зависимости от знака дота усредненной нормали
[18:31] <CEMEH> Т.е. ребром становится просто грань модельки на краю.
[18:32] <CEMEH> Это не точно и работает только для очень tesselated моделек.
[18:32] <CEMEH> В чистом виде никто так не делает.
[18:32] <CEMEH> Но - можно комбинировать два метода.
[18:32] <CEMEH> Где моделька гладкая - ничего не менять, где острые ребра - вставлять denegerate quad.

[18:33] <CEMEH> [21:30] <Filippok> чё такое degenerate quad?
[18:34] <CEMEH> Ну, это такой квад, который имеет нулевую площадь в обычном состоянии

[18:33] <CEMEH> Теперь про скины.
[18:33] <CEMEH> Скины и shadow volume - это интересная проблема.
[18:34] <CEMEH> Так вот, про скины.
[18:34] <CEMEH> Классически делают так.
[18:34] <CEMEH> Трансформят всю геометрию на CPU, и по уже построенной рисуют shadow volume.
[18:35] <CEMEH> Это к сожалению означает, что CPU создает и вертексный буфер тоже, а не только индексный.
[18:35] <CEMEH> И вообще выполняет много работы.

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

21 февраля 2006

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