Arseny Kapoulkine:

Advanced Visual Effects with DirectX 11: From Terrain to Godrays - Better Use of DirectX11

Speakers: Iain Cantlay (NVIDIA), Andrei Tatarinov (NVIDIA)
Доклад про тесселяцию номер N+1.
Сначала там было вкратце про то как использовалась тесселяция для ландшафта в двух тайтлах - BF3 и HAWX2.
Там вроде ничего полезного не было вовсе.
В нескольких слайдах были сравнения скорости в FPS, фууу.
Дальше значит идея в том что тесселяцию можно использовать по назначению и не по назначению.
По назначению это например Metro: Last Light.
Там была задача улучшить картинку с помощью тесселяции и displacement map не меняя при этом арт.
Были следующие проблемы.
  • 1. Тесселировать очень большие полигоны сложно т.к. максимальная степень тесселяции ограничена.
Тесселировать большие вытянутые полигоны сложно т.к. получается много тонких полигонов, что отрицательно сказывается на производительности pixel shading.
Поэтому где-то в рантайме (то ли при загрузке уровня, то ли еще как) большие треугольники разрезались по самым длинным ребрам.
В идеале надо для такого арт менять, но арт менять было нельзя.
  • 2. Тесселировать надо с учетом разницы в displacement; поскольку в памяти уже есть displacement map (а точнее height map для параллакса?), то можно эту разницу посчитать прямо в шейдере.
Для этого надо сравнить семпл из мип уровня N с семплами из мип уровня N-1.
Видимо так для каждого мип уровня, как-то мутно было описано.
Arseny Kapoulkine:
  • 3. В depth prepass включать тесселяцию очень не хочется т.к. очень сильно падает производительность.
Но если ее не включать то если displacement может сдвигать вершины в направлении обратном нормали (т.е. может быть отрицательным) то будут артефакты из-за того что глубина, записанная в depth prepass, не консервативна.
Решения два - или отключать depth prepass, или делать positive displacement (т.е. нельзя вдавливать геометрию, только выдавливать). В Metro: LL выбран первый вариант.
  • 4. В shadow map pass включать тесселяцию тоже не хочется, но если ее не включать то на некоторых объектах есть артефакты самозатенения.
Решается так же как 3 - displacement должен быть положительным.
  • 5. Если на стенке приклеен decal, то displaced геометрия будет его протыкать.
Решается очень просто - если displacement всегда отрицательный, то проблемы нет.
Еще можно решать screen space decals.
  • 6. Пункты 4 и 5 конфликтуют между собой - в Metro для каждого объекта был выбор, в какую сторону смещать вершины, и в зависимости от того, были заметны артефакты от самозатенения или были ли декали, выбирался либо положительный либо отрицательный displacement.
Теперь давайте поговорим про использование тесселяции не по назначению.
Во-первых, использование плоской тесселяции фактически позволяет переносить часть вычислений в domain shader, и регулировать частоту этих вычислений факторами тесселяции.
Если есть достаточно low frequency эффект то может оказаться что частоты выполнения vertex shader недостаточно (см. gouraud vs phong), а частоты выполнения pixel shader слишком много (неэффективный расход compute power)
Канонический пример - отбрасывать тени на партиклы можно в VS, можно в PS, а можно тесселировать каждый партикл в зависимости от его размера на экране и считать тени в DS.
Это уже было описано примерно здесь http://www.roxlu.com/downloads/scholar/008.rendering.practical_particle_lighting.pdf
Arseny Kapoulkine:
Во-вторых, можно тесселяцией делать более быстрые и качественные атмосферные эффекты.
Вот была такая статья 15 лет назад, MCCOOL, M. D. 2000. Shadow volume reconstruction from depth maps. ACM Transactions on Graphics 19, 1 (January), 1–26. ISSN 0730-0301.
Этот метод - про нее.
Типично качественные god rays делаются следующим образом -
Для каждого пикселя экрана (ну или quarter resolution буфера) берется луч, выходящий из камеры и проходящий через этот пиксель.
По этому лучу делается несколько шагов (до глубины пикселя)
Для каждого шага получается world space позиция, преобразуется в shadow map space и делается семпл из shadow map.
А потом все это усредняется.
Получается симуляция мелких частиц воздуха, освещенных солнцем (aka god rays)
Проблема в том что во-первых надо делать много шагов по лучу.
Во-вторых шаги часто дискретные, из-за этого достаточно много альясинга при изменении камеры итп.
Совершенно случайно на прошлом GDC рассказывалась эта техника в контексте Crysis 3.
Но это в общем прошлый век, давайте делать стенсильные тени.
Сделаем квад, расположенный так что он совпадает с near plane в sun shadow frustum.
И потесселируем его очень подробно (чтобы на каждый пиксель shadow map приходился один вертекс этой решетки)
А потом каждый вертекс вытянем в направлении источника света на значение, написанное в shadow map.
Получается такой меш типа shadow volume, который потом можно нарисовать в главный RT.
Вместо того чтобы как в стенсильных тенях увеличивать-уменьшать стенсиль на front/back facing гранях, давайте на front facing добавлять блендингом какое-нибудь значение, а на back facing - вычитать.
На слайдах была красивая картинка с вытянутым мешем, но в принципе кто с стенсильными тенями работал, может себе представить.
Теперь давайте вспомним что у нас есть хардварный тесселятор.
И вместо того чтобы тесселировать квад так чтобы в каждом пикселе было по вершине, сделаем адаптивную тесселяцию.
Как уже было в трех докладах до этого - посмотрим на мипы и сгенерируем много геометрии там где надо.
Техника была шипнута в Assassin's Creed: Black Flag.
Говорят что до 4 раз быстрее техники с шаганием по лучу, и лучше качество т.к. меньше альясинга (правда видимо не учитывается глубина затененных участков?) и banding.
Вот, все. Остался последний доклад понедельника!