Flatout2 render: как это работает?

Flatout2 render: как это работает?

статья с gamedev.ru

баннер из группы POEHAVSHIY

Решил пореверсить рендер FlatOut2. Причина банальна: не так часто сейчас выходят игры, которые отлично выглядят, и не тормозят при этом. Результаты ниже, может кому-нибудь пригодятся эти сведения, для написания своего автосима :)

Сначала общие сведения.

В кадре 70 - 120 тыс. полигонов. Все рисуется исключительно шейдерами 1.1 (что, в общем то, и не удивительно, учитывая то, что игра, также, вышла и на XBox). Дипов (запросов на отрисовку) от 700 до 1100, что, на удивление, много.

Теперь процесс рендера поэтапно.

1. Тени для машин. Каждый автомобильчик имеет свою текстуру с тенью (256х256, R5G6B5). Туда рисуются только кузов и колеса. Очень похоже, что это самый малодетальный LOD. Шейдер элементарный. Получается такая картинка:

Flatout2 render: как это работает?

2. Небо. Сделано просто и оригинально: само небо - полукуб. Легко представить себе, как кубик разрезанный горизонтально пополам. Затем на уровне горизонта кольцо, с панорамной текстурой гор, домов, леса и т.д. Удобненько, потому что, тип неба (вечернее, дневное) можно менять отдельно. Хотя, можно было все тоже сделать одним кубиком и одной кубемапой. Вышло бы меньше draw calls.

3. Земля. Вот тут просто супер. Для каждой трассы есть одна (2048х2048) текстура земли, в которой рисунок уровня с видом сверху. Все статические тени от холмов, мостов, и других объектов уже на ней. При рендеринге используется эта текстура, и различные текстуры деталей (листики там, камешки). При их сложении получается очень симпатично. Модель освещения тоже очень простая и очень эффективная. Для всех статических объектов (не только земли) освещение предрассчитано, и хранится как диффузный цвет в вертексах меша. В реалтайме ничего не считается. В результате получаем очень короткие шейдеры, которые очень быстро исполняются. На этом этапе есть хорошая сортировка как по материалам, так и по текстурам.

4. Кактусы, деревья. Есть статик батчингом. Я так и не понял, почему он то используется, то нет. Есть подозрение, что нефизические объекты за пределами трека рисуются кучами, а все остальные нет. На счет сортировки по материалам, то тоже не понятно. Хоть все рисуется одними и теми же шейдерами, но все равно каждые несколько draw calls обрамлены ID3DXEffect::Begin, BeginPass, EndPass, End. Освещение предрасчитано и тут. Шейдер такой же как и для земли. ps: 1+1 инструкций, vs: 6.

5. Машинки, часть 1. Без колес и стекол. Используются самые сложные шейдеры в игре. Есть диффузное освещение с использованием кубемапы (A8, вверху светло, книзу темнеет), спекуляр от солнца. В ps, также, передаётся степень повреждения рисуемой детали, на основе которой выбирается текстура новой, либо повреждённой машины. В альфа-канале текстуры авто содержится отражающая степень поверхности. Для отражений используют левую кубемапу. Она одинаковая для всех трасс. На ней деревца и горы. Никакой динамики.

6. Физические объекты. Используют диффузную кубемапу. Опять странная сортировка по материалам. Частичная какая-то.

7. Машинки, часть 2. Элементы двигателя, интерьер, колесные диски. Шейдер как для части 1.8. Водитель. Хардварный скининг.

9. Тени под машинами. Строится меш, который стелется по земле. Сначала рисуется простое тёмное пятно. Затем используется динамическая текстура тени сделанная в п.1. Интересно то как они заблуривают тень. Блурят семпла 4 раза одну и ту же текстуру, немного смещая её в стороны. Учитывая их малый размер (256), и то что используется хардварная фильтрация текстур, результат выходит просто отличный.

10. Дальние + ближние кустики. То большие батчи (100-200 штук за раз), то по одному. Простой шейдер.

11. Машинки, часть 3. Шины, стекла, фары. Для последних двух, простые отражения, используя ту же кубемапу, что и для кузова автомобиля.

12. Системы частиц. Дым, пыль, искры. Простейшие шейдеры.

Теперь всё нарисовано. Получилось вот так:

Flatout2 render: как это работает?

Далее пост-процесс.

13. Считаем яркость картинки. Проще говоря, из цветной делаем черно-белую.

14. Используя яркость пикселя (из ч-б изображения) и специальной градиентной 1D текстуры делается color remap. Яркие пиксели получают один оттенок, темные другой. Вечером, например, освещённые участки немного красноватые. После ремапа, полученная картинка комбинируется с цветной.

15. Даунсемплим изображение из п.14 в 256x256. Затем выделяем яркие места простым шейдером.

16. Блурим пинг-понгом 4 раза, методом, аналогичным с методом блура тенюшек от машин. 4 tap, используются смещения в текстурных координатах.

17. Объединяем заблюреную текстуру с основной картинкой. Получили glow эффект:

Flatout2 render: как это работает?

18. Делаем 2 radial blur тем-же методом, только теперь текстурные координаты не смещаются, а с каждым разом увеличиваются. Получили изображение, которое используется при нитро-ускорении:

Flatout2 render: как это работает?

19. UI. Тут все стандартно. Рисуем поэлементно. Сортировок никаких нет.

Это всё. Выводы, которые я сделал из этого маленького исследования:

  • Арт и умелое использование эффектов решает (я это и раньше знал, но убеждаюсь все больше). Во Flatout2 нет ни одной cutting-edge графической технологии. Новомодных технологий можно наклепать три корзины. Но если у вас нет хорошего арта, и грамотной (!) настройки этих всех визуальных фишек - у вас все будет тормозить и при этом выглядеть отстойно.
  • Еще раз отметил для себя хороший принцип, который должен знать каждый разработчик игр: не надо считать каждый раз то, что можно посчитать один раз.
  • Сортировки по материалам и текстурам в движке скорее нет, чем есть.
  • Был немножко удивлен простоте, но не в ущерб качеству (хотя сортировочку можно было сделать и получше). Рендер прост и быстр.
4545
23 комментария

Игра очень хорошо выглядит даже сейчас, но вот физика в игре, конечно, требует сильной доработки. В игре есть деление на три типа чемпионатов и если в первом всё работает просто офигенно то, начиная со второго, у игры начинают проявляются серьёзные проблемы. Дело в том что чем быстрее ты едешь тем больше урона получаешь от всякой разрушаемой мишуры типа камешков или дорожных конусов. В итоге в третьем чемпионате ты шарахаешься всего что того можно иначе машину тут же раздраконит в сопли. Но самое стрёмное это когда ты едешь уже по второму и третьему кругу и, благодаря соперниками, вся трасса уже, нахуй, засрана всем чем только можно и гонка превращается в сраную говоломку. Проходил оригинальные три части серии и на последних этапах охуевал знатно.

P.s. Фух, выговорился)

Ответить

Не знаю откуда такие проблемы, вторую часть наоборот дизайнили чтобы ты сбивал как можно больше пропов для нитры: 95% объектов в игре очень лёгкие, даже что-то здоровое типа металлических бочек, валунов легко отлетает часто без дамага для авто. Самое проблемное это брошенные машины, стены из шин на обочине - но их оч мало.
А вот в первой части объекты тяжёлые, да и сами авто оч медленные

4
Ответить

Проходил двойку неоднократно. Хз, не видел такой проблемы, что надо от всего шарахаться на гоночных машинах.

Ответить

Не, ну за такое 5к надо давать👍🏻

1
Ответить

я думал это рпг про постапокалипсис

Ответить

Я тоже так думаю потому что пропустил ту пару лет.

Ответить

Если не возьмешь веревку то заставят гонять на машинах.

Ответить