Unity LWRP vs HDRP

Unity SRP相關(guān)的文章其實(shí)Unite 2019結(jié)束就想寫(xiě)了,無(wú)奈Unity之前的版本存在bug,在雙顯卡的機(jī)器上用renderdoc會(huì)崩潰,直到2019.1.3f1版本才修復(fù)了這個(gè)問(wèn)題。估計(jì)LWRP和HDRP的相關(guān)的結(jié)束文章和代碼分析也看的差不多了,所以本文另辟蹊徑,從畫(huà)面調(diào)試入手,分享Unity LWRP和HDRP的不同,也希望借此給大家一個(gè)分析別人游戲畫(huà)面的思路,還有畫(huà)面出現(xiàn)問(wèn)題時(shí)該如何定位問(wèn)題的方法。本文比較基礎(chǔ),對(duì)于適合沒(méi)有圖形調(diào)試經(jīng)驗(yàn)但想學(xué)習(xí)圖形調(diào)試方法的同學(xué)觀看。
本文就是用Unity SRP的默認(rèn)場(chǎng)景了,更復(fù)雜的場(chǎng)景其實(shí)也一樣,畢竟是同一個(gè)render path


兩張圖分別是LWRP和HDRP的,不知道大家能不能肉眼分出來(lái)。
上面的是LWRP,下面的是HDRP。兩者乍一看其實(shí)去吧不是特別大,特別是材質(zhì)上,畢竟都是PBR材質(zhì)。兩者的肉眼可見(jiàn)的畢竟明顯的區(qū)別其實(shí)也不算多,也就是兩者色調(diào)存在差異(觀察天空盒可以比較明顯的看出),探照燈(兩者光強(qiáng)也存在一定差別,不過(guò)LWRP仔細(xì)看可以感覺(jué)沒(méi)什么衰減,HDRP和自然界的光則比較像,實(shí)際參數(shù)LWRP就用不知物理含義的強(qiáng)度,HDRP則用了物理單位流明)
靠肉眼區(qū)分還是太難了,所以,還是掏出renderdoc,看管線吧


這下子應(yīng)該比較直觀了,HDRP的render path長(zhǎng)度是LWRP的幾倍,而且對(duì)渲染有一定了解的同學(xué)一定也看出來(lái)了,LWRP是標(biāo)準(zhǔn)的forward rendering,而HDRP則是tile based hybrid deferred/cluster forward rendering,對(duì)3A游戲有些了解的對(duì)這個(gè)詞一定不陌生。
LWRP分析
LWRP比較短,所以分析的全一些
LWRP的第一步,是渲染main shadowmap

shadowmap一般使用了一張2k分辨率R16_TYPELESS格式的貼圖,沒(méi)有使用常見(jiàn)的深度貼圖(d24c8)格式,畫(huà)了四次,因?yàn)槭褂昧薈SM。之前Set render target的時(shí)候
第二步是Additional shadows

這個(gè)過(guò)程中每個(gè)可投影的光源都會(huì)生成自己的shadow map,場(chǎng)景中只有一個(gè)Spotlight,所以繪制了一次,而且可以看見(jiàn),次重要的光源使用1k分辨率的陰影貼圖,沒(méi)有開(kāi)啟CSM
緊接著就是第三步Z prepass

做一次z prepass類似于earlyZ,建設(shè)overdraww
第四步,resolve shadows

resolve shadowmap,可以看到這個(gè)過(guò)程中貼圖的格式已經(jīng)變成了R8,其實(shí)還能看到貼圖開(kāi)啟了MSAA x4,已經(jīng)可以斷定LWRP默認(rèn)開(kāi)啟MSAA x4抗鋸齒
接下來(lái)終于到了重頭戲,Render Opaques

在這個(gè)過(guò)程中,所有不透明的物體依次渲染,絕大部分場(chǎng)景都是最重要的render pass
緊接著是渲染Skybox

Unity LWRP并沒(méi)有把skybox放在opaque里,因?yàn)閦 perpass也沒(méi)有處理skybox
Opaque的物體處理完了就該處理Transparent

這個(gè)場(chǎng)景半透明物體很少,也基本看不見(jiàn),一般的話要在半透明這個(gè)pass中繪制水,玻璃這些半透明物體,以及粒子特效等使用alphablend材質(zhì)的物體
最后渲染一些后期效果

LWRP默認(rèn)場(chǎng)景基本沒(méi)有什么后期處理,就有HDR tonemapping和Bloom,這兩個(gè)后期效果是LWRP內(nèi)置的,其他的post processing需要額外配置
HDRP分析
LWRP分析的比較全面,HDRP就會(huì)稍微快一點(diǎn)了
ClearBuffers

有些同學(xué)可能不太明白為什么一大推clear還要單獨(dú)一個(gè)render pass,個(gè)人猜測(cè)這個(gè)和PS4有關(guān)系,PS4的GNM的clear的效率并不算高,在4K屏上尤其明顯,4k屏幕上GNM clear一次耗時(shí)可能達(dá)到2ms,因此在PS4上普遍采用fastclear,用compute shader來(lái)clear
z prepass

和LWRP一樣,有個(gè)z prepass防止overdraw,decal也要求必須有z prepass
DBuffer

接下來(lái)的兩個(gè)pass,DBufferRender以及DBuffer Normal,就是Deferred Buffer Decal,在DBufferRender過(guò)程中使用computer shader來(lái)計(jì)算Decal,所以還需要DBuffer Normal這個(gè)過(guò)程,通過(guò)繪制一個(gè)全屏三角形的方式將DBuffer繪制。曾經(jīng)全屏特效之類的喜歡用2個(gè)三角形占滿屏幕,因?yàn)橄袼厣釛壣伲F(xiàn)在Screen space處理更優(yōu)先使用全屏三角形,可以減少一個(gè)三角形光柵化的損耗。
GBuffer

標(biāo)準(zhǔn)的延遲渲染,沒(méi)什么好說(shuō)的
接下來(lái)的步驟和為以后的抗鋸齒和AO做準(zhǔn)備

TAA,SMAA之類和時(shí)域有關(guān)的抗鋸齒技術(shù)需要motion vector
陰影貼圖

HDRP陰影貼圖策略和LWRP相近,但shader要更復(fù)雜
緊接著幾個(gè)pass進(jìn)行光照計(jì)算

基于體的光照計(jì)算,全部使用compute shader,對(duì)延遲渲染有所了解的同學(xué)應(yīng)該也比較熟悉了
接著就是最重要的pass了——Tile based deferred lighting pass

基于tile的延遲著色,充分減少GPU bandwidth壓力,使用compute shader做的。如果不用tile可以使用正常延遲著色的方式,直接一個(gè)像素著色
Forward Opaque和Forward Opaque Emissive并沒(méi)有使用

我這里渲染走了延遲管線,所以Forward opaque是空的。如果使用前向管線,會(huì)在這里繪制不透明物體,看Tag可以知道Forward path也是tile based,說(shuō)明是F+/CFR
次表面散射

這個(gè)場(chǎng)景中并沒(méi)有SSS材質(zhì),所以這個(gè)pass也是空的
接下來(lái)繪制天空

天空繪制的過(guò)程中,在LWRP的skybox的基礎(chǔ)上,多了一次大氣散射的pass
半透明Z prepass

這個(gè)步驟可以進(jìn)行alpha clipping,作用類似alpha test,本例中為空
Forward PreRefraction

如果使用了SSR會(huì)用到,本demo中為空
計(jì)算各個(gè)mip的高斯模糊

很多后期特效依賴高斯模糊,也可以看到高斯也是使用compute shader計(jì)算
渲染半透明物體

這個(gè)過(guò)程和LWRP相近,但是shader要更復(fù)雜
又經(jīng)歷一個(gè)Gaussian之后,來(lái)到Distortion

這個(gè)demo中并沒(méi)有使用扭曲變形特效,因此并看不出來(lái)
接下來(lái)是post processing

HDRP的默認(rèn)后期比LWRP復(fù)雜過(guò)了,動(dòng)態(tài)曝光調(diào)整,TAA抗鋸齒,Bloom,Color grading,所有過(guò)程都是compute shader,所以需要一個(gè)final pass,繪制一個(gè)全屏三角形來(lái)應(yīng)用
保存當(dāng)前幀Depth

在最后保持當(dāng)前幀的Depth
小結(jié)
以上就是Unity LWRP和HDRP的渲染分析,希望對(duì)大家有所幫助。