@sim0nsays: GDC Report – Rendering in Assassin’s Creed 3

Я ходил на GDC на Main Conference, не на Workshops, поэтому про графику и тек было всего мало – пропорционально его наличию в индустрии. Ну вот, как всегда, про тек в AAA-titles рассказывают.

Доклад очень сумбурный – крайне коротко про все что было в AC3, поэтому каждому эффекту досталось всего несколько минут. Тем не менее, основные идеи понятны, а детали реализации все равно не копируются.
Мне вот про хак с освещением понравилось.

People in this conversation:
Simon Kozlov Add
Engineer at ROBLOX (www.roblox.com), previously at Microsoft. And ClosedCircles was my idea.
Arseny Kapoulkine (Zeux) Add
CREAT Studios, Saber3D, Sperasoft (EA Sports – FIFA). Currently making kids happy at ROBLOX. http://zeuxcg.org/
Kirill Kyalundzyuga (_ShaMan_) Add
R&D Programmer at Wizart Animation
Pavel Nakaznenko (Crio) Add
Programmer (Xbox 360, PS3, PC, iOS, Android, Flash, HTML5)
at Darkside Games Studio
http://dtf.ru/person/cv.php?id=835
Anton Yudintsev Add
Gaijin Entertainment
Sergey Gonchar Add
Graphics Programmer (Flash Stage3D, interested in Direct3D11)

Simon Kozlov:
Итак, короткие записи с Rendering AC3, Jean-Francois St-Amour (повезло же с именем), Ubi Montreal
Надо зиму и погоду
Весь fog, дождь и атмосфера рендерится цилиндром вокруг персонажа
Есть халявный volumetric mist – noise замапленный по миру, со сдвигом на ветер
Дождь – часть в этом цилиндре, часть – particle system attached to camera
Цилиндр отсекается depth buffer, понятно.
Со снегом так не получилось, пришлось тупо херачить много патиклов в камеру
И большие патиклы для сгустков снега
Забавно что делают чтобы не было дождя в помещениях
Патиклы тупо рейкастят, а для цилиндра детектируют ситуацию частичного indoor, выкючают 4-й каскад теней и начинают рендерить occlusion mask для rain
Вокруг персонажа
Типа 128×128

Crio: а не проще стенсил там какой нибудь

Simon Kozlov: Надо мягко видимо

Simon Kozlov: surface effects для дождя определяются тупо по вертикальной нормали
Я так понял, подмешивается дополнительный текстурный слой
И для дождя, и для снега
Дошли до deformable snow

Crio: подмешиваются? типа texture bombing?

Simon Kozlov: Просто слой в ассетах, как я понял

Simon Kozlov: В AC2 был условно world light map – хранит цвет и высоту
В новом они стараются сделать каждый пиксель того лайтмапа VPL
Как они их применяют я не понял
Есть отдельный просчитанный слой с low-frequency AO, раньше запекали в вертексы, теперь видимо текстура с размытой высотой
Чтобы динамические объекты тоже получали вклад
Хак с высотой забавный
В смысле, AO хранить как размытую высоту

Далее, хотят большие толпы – 400-500 вместо 100, потому что в Америке улицы прямые и масштабные сражения, в которых тысячи
Делают инстансинг руками, ыыыы
32 раза дуплицируют vertex buffer с индексом
Непонятно, почему железный интсансинг не подошел
32 персонажа на DIP уже сходится
Скинят этих инстансенных персонажей через Render 2 VB
Типа, анимируют вертексную позицию на GPU и херачат в vertex stream
Для вот этих дуплицированных VBs
К шиппингу осилили это делать на SPU :)

Общее впечатление – слишком много всего в одном talk
Про каждую технику очень мало деталей
Так, основная идея и пара картинок

Simon Kozlov: Кстати, я встретил чувака в лобби и спросил про освещение. Раньше в большой всемирной лайтмапе был цвет и высота. Теперь на мир плоско натянуты две текстуры – в одной позиция источника + attenuation, в другой – цвет.
Т.е. для каждой точки world space освещение сводится к одному VPL
Говорит, чаще всего этого хватает для всего несолнечного освещения
Иногда конечно приходится ставить еще настоящих point lights

Simon Kozlov: Кстати, я спросил, чем не устроил железный инстансинг. Чувак говорил, что почти везде на PC инстанснга настоящего нет, драйвер внутри дуплицирует буфера O_o

Zeux: Ну в D3D9 очень странный инстансинг
Само API уже потрясает
А на DX10-class же наверняка есть честный
На current gen консолях кстати для индексированного инстансинга надо руками размножать IB (VB не надо), на боксе в принципе можно обойтись без но наверное лучше не обходиться.
Я удивлен скорее тем что они до SPU дошли только сейчас, неужели раньше у них не было того же тека про толпы?..
Уже 4 игры выпустили же!

Simon Kozlov: Раньше видимо толпы были не такие, он вроде говорил что раньше DIP на персонажа было ок

Anton Yudintsev: Это, кстати, неправда.
Вовсе не везде.
Но иногда нет, да :(

Simon Kozlov: Я тоже удивился

Anton Yudintsev: Я вот скажу, что у нас для инстансинга сейчас 3 (!) ветки кода
Для разных драйверов и железок

Anton Yudintsev: Кстати, отрадно видеть, что хоть кто-то в курсе, что такое бывает

Sergey Gonchar: уже второй раз встречаю в чате, что такое DIP?

_ShaMan_: это аббревиатура от DrawIndexedPrimitive. так назывался метод у D3D интерфейса для отрисовки геометрии

Simon Kozlov: Изначально снег это просто low-poly поднятый террейн
Когда игрок на него наступает, треугольник исчезает из low-poly меша и заменяется на очень тесселированный меш
И вот они экспериментируют с GPU-based tesselation
Шипнули с t-junctions, ыыыыыыы
Ну в общем натурально height-map пересекается с капсулой, где игрок наступил
Есть ощущение, что там пиздец хаки и количество проблем
Обмолвился, что зарыты человеко-месяцы и как бы не человеко-годы

Crio: а чем оно плохо?
избыточно?

Simon Kozlov: Пиксельные дыры могут возникать и возникают