Skip to main content

Internals of Gothic 3 game rendering engine (ru)

· 4 min read

Сегодня наш пациент рендер готики 3. Проблемы начались с самого начала. Готика никак не хочет запускаться из-под pixwin. Какая-то статически прилинкованая dll'ка инициализируется с ошибкой. Пробовал подебагать, но, к сожалению, чтобы попробовать решить проблему скила не хватает :) Итого остаётся NVPerfHUD. Разработчики забыли выбросить его поддержку из кода, так что никаких форсилок не понадобилось. Но перфхуд экспортит не все ресурсы (готика часто крашится) и выловить нужный draw call не так уж и просто, так что много картинок сегодня не будет.

Недавно, я себе открыл простой и быстрый способ определения качества рендера. Надо всего-лишь запустить игру с дебаговым директом, а потом смотреть где и как падает. :) Готика падает очень быстро. Первый кадр рендера ГУИ. Как контр-пример: вархамерровский движок Relic'а (Warhammer 40K: Down of War, W40K: Winter Assault, W40K: Dark Crusade, Company of Heroes). Прошёл в Dark Crusade пару миссий, и только потом заметил, что сижу на дебаговом директе. Хороший рендер. :) Извините, отвлёкся.

Машина на которой тестировалась игра: A64X2 4200+, 2GB RAM, GF7800GT. Настройки игры - high.

Фпс 15-20. Чему удивляешься сразу, так это маленькому количеству DIP calls. 400-700. Всегда. Без динамических тенюшек так вообще 300. Все здорово до того момента, когда мы достаём факел. DIPы подскакивают до 1200. Вы тоже подумали сразу про omnidirectional shadow maps? Правильно, они там есть. :) Кстати, фпс падает всего на 2-3.

Что, как и в каком порядке рисуется в готике:

  1. Shadow map от солнышка (directional light). Тут все просто. Берём квадрат вокруг персонажа со стороной 20 метров, и все объекты что туда попали рисуем. PSM, TSM, LiSPSM и т.д. не используется. Используем NV depth texture hack.

  2. Если включен факел, то рисуем R32F cubemap.

  3. Z-only pass. Рисуется не все, а только крупные объекты. Очень правильно.

  4. Баундинг боксы для использования HW Occlusion Query. Опять же, объекты не все.

  5. Если включен Depth of Field эффект, используем MRT. 2 рендер таргета: цвет (R8G8B8A8), и глубина (тоже R8G8B8A8). Глубина записывается как есть, никакой запаковки флоата в восьмибитные каналы не происходит.

  6. Рисуем персонажей. Скиннинг на GPU, нормал мапы, попиксельные точечные (я видел 2) и направленные источники. 2 шадовмапы (от точечного источника и солнышка). Предрасчитанная текстура с тенями от террейна. Используются даже Spherical Harmonics (не спрашивайте меня, что это. Я сам с трудом представляю:) ). Шейдеры показывать не буду, так как они длинные и страшные.

  7. Ближняя земелька рисуется очень похоже. Нет скининга, есть несколько слоёв смешанных по маске. Я бы текстурки показал, но по причинам описанным выше (pix не работает), я их не добыл. Сорри.

  8. Ближние объекты (деревья, камни, травка).

  9. Всякие дальние объекты. Огромные куски земли. Спидтришные деревья, крупные объекты. Шейдеры тут простые. Зачастую туманчик + 1 текстура. Получается примерно следующие картиночки:

  10. Простое Небо.

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

  1. Даунсемплим картинку. Используем color remap, чтобы выделить яркие области.
  2. Блурим её разочек.
  3. Собираем финальное изображение. Блум текстура + сцена + глубина сцены. Пуассоновским фильтром блурим основную картинку, радиус распределения получая из текстуры с глубиной. Не Depth of Field, конечно, но нечто похожее.

Про воду забыл. Я по игре много не бегал, но морская вода совсем не такая, которая была описана Куртом Пельзером (Kurt Pelser) в ShaderX2 - Tips and Tricks. Простая какая-то. Я думал уже накручивать сложность эффектов так накручивать. Хотя ещё проходы они бы, наверное, уже не потянули. :)

ГУИ - хороший. Не по буковке. :) Отвлекусь ещё раз. Вот в Supreme Commander Multiplayer Beta ГУИ! ГУИще самый настоящий. :) Кто не знает - это стратегия такая. Так вот, там весь ингейм ГУИ рисуется за 1 (один) draw call! :) Сильно.

Короткие выводы. Что понравилось: Впечатлён технологичностью рендера. Отличная draw call reduction оптимизация, что позволило сделать даже такую экзотическую вещь, как omni shadows.

Что не понравилось: Чувствуется халатный подход (дебаговый D3D. VB, IB постоянно создаются в рантайме).

Мне рендер скорее понравился, чем нет. Это даже не смотря на тяжёлые шейдеры, и как следствие низкий фпс.

Update Нашёл параллакс. Есть на каменной площади в стартовом городишке. По просьбам больше картинок, которые прояснят ситуацию с батчингом геометрии. Ближняя травка: Ближняя земелька: Дальние деревья: Камешки: Дальняя земля: В городах все стандартно. Домики по кускам. Отдельные объекты (лавочки, столбики, заборчик).