[翻譯]DOOM(2016) - Graphic Study
DOOM(2016) - Graphic Study
剛開始前半部分遊戲時的一幀
Mega-Texture Update
第一步做Mega-Texture的更新
在GPU allocate一個16k*8k的texture,每個tile128*128 texel
在每幀一開始,DOOM會update這些VT
Shadow Map Atlas
對於每個投影的光源,會在8k*8k的超大貼圖中使用atlas渲染depth map。但是並不會每幀更新所有的光源depth map。
如果光源照射的範圍都是靜態物體,那麼不需要任何更新,如果範圍內有移動的物體時才需要regenerate。Depth map的大小根據不同的情況變化很大,比如靠近相機的距離。DOOM會優化cache靜態物體的depth,只計算動態物體,然後合成。
Depth Pre-Pass
這遍renderpass只渲染深度,按照玩家的武器->靜態模型->動態模型的順序。實際上,它並不只是輸出depth,對於動態的物體還會輸出velocity
Occlusion Queries
DOOM會做GPU Queries,因為之後幾幀才會拿到結果,所以比較保守
Clustered-Forward-Rendering of Opaque Objects
所有opaque物體和decal直接forward渲染,使用了clustered forward來處理大量光源。DOOM使用了16*8的視域分割,如果簡單的像一般forward+那樣直接處理光源計算,還是會有很多邊界問題。DOOM更進一步把視錐在3D上進行切割,每個block成為cluster,一共3072個cluster(16*8*24),z軸的分割按照log分布。
-首先cpu計算每個cluster需要交互的數據:光源、decal、cubemap…每個cluster最多處理256個光源,256個decal以及256張cubemap
-GPU渲染像素時:
*根據當前像素的depth來確定在哪個cluster
*獲取當前cluster的decal/light list
*遍歷每個light/decal,計算它們的光照
根據3級索引找到light/decal的信息,所以CPU花點時間來整理這些數據可以極大的降低GPU的開銷。最近cluster forward rendering又變的熱門起來,因為相比於deferred去r/w GBuffer,它很高效快速,同時相比於forward,它可以處理更多的光照。
這步renderpass還會輸出兩個thin
GBuffer:Normal和Specular,主要是為了之後做一些後處理比如反射等。最後,它還會輸出一張160*120的feedback
buffer,給mega-texture用來計算stream哪一層mipmap。Mega-texture需要在renderpass之後來確定需要load哪些texture(不會有突然的popup視覺問題嗎)GPU Particles
GPU來模擬粒子的位置、速度以及生命周期,根據normal和depth去做碰撞檢測
SSAO
包含specular occlusion,在半解析度上渲染。
SSR
需要depth/normal/specular/上一幀tonemap之前的colorbuffer
Static Cubemap Reflection
相當於IBL,使用預生成的128*128的cubemap,放置在不同的位置,稱之為environment probes,就是之前cluster forward中的probe。當前環境收到5個probe的影響,ps讀取depth/normal/specular,查找當前像素受那些probe影響,計算得出靜態反射貼圖。
Blending Maps
這步cs來混合之前所有的結果
-SSAO
-有效的SSR
-對於SSR失效的區域使用static reflection
-fog effect
Particle Lighting
Particle是在uv space上做的lighting,根據世界坐標中的pos,light-list,和shadowmap。把結果存在4k atlas的貼圖上,根據質量設置/距離camera的距離來確定tile的大小。
等真正畫粒子的時候,會使用full-res rt,upscale lighting之後blend。DOOM解耦粒子的光照計算好處是,不論使用怎樣的解析度,粒子計算依然是低解析度可控的,因為絕大多數粒子光照都是低頻信息。(怎麼有點像PTex)
Downscale and Blur
Downsample到40pixel,因為後面半透的反射需要用
Transparent Objects
DOOM中結冰或者髒的玻璃材質特別出彩,ps計算decal的blurriness然後選擇downsample的rt作為背景
Distortion Map
使用depth test來渲染一張低解析度distortion map,rg通道代表xy方向的擾動,b通道代表需要blur的大小
User Interface
UI在另外的rt中渲染,在LDR space使用premultiplied alpha
TAA & Motion Blur
Scene Luminance
計算luminance給tonemapper做準備
Bloom
傳統bloom方式
Final Post-Processing
-heat distortion
-加上bloom
-vignetting/dirt/lens flare
-tonemaping & color grading
Tonemapping使用的是uncharted2的filmic
UI & Film Grain
Total: 16ms,1331 dp,132 textures, 50 RTs
Bonus
Glass
-準備好opaque mesh color的downscale chain
-從遠到近畫半透,加上decal/lighting/probe,最後根據blurriness來sample chain
DOF
傳統dof的問題
-bokeh,不能很好地模擬各種鏡頭的小孔成像
-bleeding
DOOM的dof分near/far field
-near field,強力blur,越bleed越好
-far field,blur時不讀取in-focus和near field的像素
DOOM在半解析度上blur,64taps的採樣權重相同,disk直徑根據CoC來計算;然後再進行一次16taps的blur,保留最高的周圍採樣像素,這樣拓寬了上一次blur的結果而且修復了gap等瑕疵。
最終使用alpha blend合成near&far,DOOM的dof在motion blur之前做。
此篇到此為止,結合下一篇SIGGRAPH16的,對DOOM整體應該會加深了解。
推薦閱讀:
※Dirty Game Engine
※從零開始手敲次世代遊戲引擎(四十二)
※[CppCon14] How Ubisoft Montreal develops games formulticore – before and after C++11
※[GDC17] Ghost Recon Wildlands:Terrain Tools and Technology
TAG:遊戲引擎 |