標籤:

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