Я просто обязан был изучить рендерер Mortal Kombat 11, чтобы понять, как же достигается такая удивительная графика, а теперь поделюсь своими открытиями с вами.
Проход вычисления теней
Каждый кадр начинается с прохода теней (shadow pass).
![]() |
![]() |
---|
Каждая карта теней составляется из четырёх стенсил-карт глубин теней с суперсэмплированием (SSAA), которые затем преобразуются в четырёхканальную моментальную карту теней (Moment Shadow Map, MSM) [Peters et al. 2016]. В каждом из каналов хранятся , , и .
![](https://habrastorage.org/getpro/habr/post_images/96b/83b/463/96b83b4633fab9c9230364a1fe03d966.jpg)
Позже эта карта используется в проходе получения теней (shadow resolve pass) до наложения освещения. В результате получается наилучшее качество теней, которого можно достичь растровыми методами затенения.
В массиве текстур закодировано три отбрасывающих тень источника освещения, которые присутствуют в этой сцене.
G-Pass
![]() |
![]() |
---|---|
![]() |
![]() |
Общий проход (General Pass, G-Pass) в Mortal Kombat 11 выглядит довольно странно. Есть четыре буфера элементов, в которых хранятся такие сжатые данные, как яркость, нормали видового пространства по оси X, линейная глубина (из которой можно сделать вывод, что в качестве единиц измерения в Mortal Kombat используются метры (м)), а также странные данные, например, ambient occlusion с дизерингом и идентификаторы материалов.
Почти каждый входной материал в G-Pass хранится в формате сжатия блоков.
Ambient Occlusion
![]() |
![]() |
![]() |
---|
До прохода ambient occlusion из своих сжатых буферов геометрии (G-Buffers) воссоздаются нормали видового пространства и глубина, а также вычисляется иерархический z-буфер [Greene et al. 1993]. Затем на основании этих буферов в сочетании с массивом текстуры белого шума
32x32
размера 8
вычисляется ambient occlusion.Зеркальное освещение
![](https://habrastorage.org/getpro/habr/post_images/ee3/863/14e/ee386314e276f4ff95d7b03a7eea010e.jpg)
Зеркальное освещение использует IBL из кубической карты
512x512
, а также источники освещения в сцене, и вычисляется при помощи вычислительного шейдера по фрагментам.Рассеянное освещение
![](https://habrastorage.org/getpro/habr/post_images/7a6/65b/75e/7a665b75e0d393923972e4b06f6d6816.jpg)
В проходе рассеянного освещения (diffuse lighting) тоже используется вычислительный шейдер и оно вычисляется по фрагментам.
Объёмное освещение
![](https://habrastorage.org/getpro/habr/post_images/39a/556/3e4/39a5563e422ce0337a1cf1a159fc0f14.gif)
Объёмное освещение выполняется при помощи линейной глубины, а также текстуры рассеяния и пропускания света.
Временно?е сглаживание
![](https://habrastorage.org/getpro/habr/post_images/8f7/646/a91/8f7646a91671edeacaf87009c27a34b8.jpg)
Стандартно для временно?го сглаживания (temporal anti-aliasing) используется буфер скоростей для репроецирования предыдущих сэмплов и получения готового сглаженного результата.
Проход UI
![](https://habrastorage.org/getpro/habr/post_images/e41/632/8b1/e416328b118d07a70c045bc69bc3317e.png)
Весь интерфейс в Mortal Kombat рендерится в отдельный render target, а затем накладывается поверх готового результата с тональной коррекцией.
![](https://habrastorage.org/getpro/habr/post_images/071/fd7/abe/071fd7abe5b7d93d7e79b0be46462472.jpg)
Mortal Kombat — одна из самых красивых игр в поколении проектов с рендерингом на основе растеризации.
atri1
хорошая статья для отпугивания от геймдева, я сам читал такие статьи пару лет назад и ужасался что ничего не понимаю
на самом деле все что написано в статье делается базовыми демками для вулкана или dx12, и не сложной шейдерной логикой строк на 50
MorskoyZmey
Все что описано в статье делается самим движком UE4 по умолчанию.