[翻譯]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這一套pbrMetalness 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:遊戲引擎 |