標籤:

[翻譯]Metal Gear Solid V – Graphics Study

Metal Gear Solid V – Graphics Study

V一開始逃脫醫院的一幀

Depth Pre-Pass

FoxEngine的Pre-Z只渲染Terrain,Terrain使用的存了16bit

float的Heightmap。Heightmap被分割成tiles,每個tile用來渲染16*16的vertex的網格,此幀的terrain用了150個dp

生成G-Buffer

BGRA8格式的3張RT。

Albedo:AlphaChannel用來存放透明度(實心物體1,草或者樹葉0)

Normal:看起來是world-space

normal,alpha是存放各向異性roughness的係數

Specular:R:Roughness,G:Specular,B:MatID,A:3S的半透係數

Depth:32bit Reversed Z

先渲染非半透物體(角色、建築),地表,最後是Decal

*Decal是怎麼Blend到GBuffer上的。。。Frostbite還有一篇專門提到了這個,沒啥好的辦法

Velocity Map

只有上校有計算Velocity,對於趴在地上的醫療兵,engine把他當成了靜態模型。因為計算Velocity需要兩次蒙皮很費,所以能省一點是一點。R通道只用來標記是動態物體,B和Alpha通道來記錄v的兩個分量

接著引擎使用靜態物體的depth buffer reproject到上一幀來計算velocity,最後和動態物體blend到一起

*為什麼不在GBuffer的時候一起生成Velocity。好處是省了大部分vs的一次蒙皮計算,以及GBuffer時ROP和帶寬,壞處是增加了dp開銷和一個ss開銷,而且作者也說8bit的精度有些低,GBuffer可以用RG16F的,不用一個mask通道,至少也可以用A2RGB10吧

SSAO

使用了Avalanche的AO。使用了半解析度的RT,alpha用來存放AO結果,RGB存放線性depth

第二遍使用ScalableAO,與原實現不同的是,沒有使用H-Z以及重建normal,而是直接讀normal

buffer,每個像素11個採樣點

注意SAO的參數故意調節為保留高頻信息,對比LISSAO看戰士的褲子褶皺

帶深度的雙邊濾波後使用cs進行合成

Irradiance Spherical Maps

GI diffuse使用離線bake的2階SH係數9個float3來保存,用這些float來實時生成spheremap,每個spheremap16*16像素,共用一張texture。事先離線捕捉環境到cubemap,在轉換為SH。好處是SH省空間以及gpu帶寬

Diffuse Lighting(GI)

每個dp的input mesh是一個cubemap所影響的boundingbox,類似點光的畫法,在一張half res的rt上去sample GBuffer和irradiance spheremap

等所有的irradiance map blend完成後,再使用雙邊濾波resolve到full rt上

Non-Shadow-Casting Lights

和一般的點光shading沒啥區別,分diffuse和specular兩張rt

Shadow Maps

4k*4k的解析度,給投影的光源使用

Shadow Casting Lights

現在渲染這些具有陰影的光源,光源的陰影可以選擇性的影響diffuse或者specular。最後加上主光,主光是之前SH生成的spheremap

Lighting Combination and Tonemap

(Albedo*diffuse+specular)*AO和深度霧進行blend,之後進行tonemap,alpha存HDR下的luminance

MGSV的TM曲線(看起來HDR range不高啊),之後再加上gamma矯正

奇怪的是MGSV接下來一堆工作都是在sRGB空間做的,包括半透、反射、DOF等,估計是美術太喜歡在PS中模擬了

Emissive and Transparent Objects

反射使用256*256的reflection

cube,離線捕捉好的。因為MGSV是具有24小時和天氣系統的,所以cube的數量很大,每個小時都會產生晴天/多雲/下雨/風暴這4張cube。

Screen Space Reflections

在half-res上做rt,採樣大於1spp,如果反射方向在ss以外,使用alpha去平滑的過度SSR的消失

Heat Distortion, Decals and Particles

這些fx還是主要看美術製作的功力,MGSV的效果真心不錯

Bloom

因為是在LDR空間了,所以需要依靠alpha通道的luminance來計算bright的區域。另外還會考慮lens flare和chromatic aberration

Depth of Field

DOF用的是半解析度,分前後景,根據CoC的size去sprite scattering,為了性能考慮,會在不同解析度的rt上scatter,vs根據當前的rtsize和CoCsize去reject

Lens Dirt and More Lens Flares

大部分都是sprite,半解析度上render,blend回原rt。這個真的挺看美術手藝的,技術上沒啥好說的(MGSV里閃瞎眼的光暈,真的挺帶感的。。。)

Motion Blur

Color Grading

Anti-Aliasing

都是正統流程

Final Touch

最終會加入美術定製的一些screenEffects,比如暗角亮邊等,感覺Fox Engine深入定製一些美術的人工干預流程,而且整體PP都在sRGB,像是在使用PS一樣,說不上好還是壞

2331 draw calls, 623 textures and 73 render

targets

這麼一個簡單小場景2300+dp,跑到沙盒大世界得多少dp啊。。。fox engine的優化真不是蓋的

另附:

MGSV PBR Texture Analysis

Albedo Map [RGB]

FoxEngine還是使用albedo

roughness metallic這一套pbr

Metalness Map [B]

Roughness Map [G]

Specular Levels Map [R]

Specular Level用來調整金屬/非金屬的反射率的係數

Normal Map [RGBA]

Transmissive [RGB]

Subdermal [RGB]

Masks [RGB]

MGSV的角色真是花了大力氣,三張RGB貼圖,3S獨佔兩張


推薦閱讀:

[CppCon14] How Ubisoft Montreal develops games formulticore – before and after C++11
[GDC16] Optimizing the Graphics Pipeline with Compute
[Siggraph15] GPU-Driven Rendering Pipelines
從零開始手敲次世代遊戲引擎(四十二)
[GDC16]Global Illumination in Tom Clancys The Division

TAG:遊戲引擎 |