? 好吊妞无码中文字幕在线视频,国产精品自产拍97
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽(yáng)街道洪山路國(guó)際工業(yè)設(shè)計(jì)園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁(yè) > 3D教程 > 圖文教程

虛幻引擎4渲染流程分析

來(lái)源: 52vr | 責(zé)任編輯:傳說(shuō)的落葉 | 發(fā)布時(shí)間: 2019-04-23 08:45 | 瀏覽量:

    今天為大家?guī)?lái)的是轉(zhuǎn)載自虛幻引擎愛(ài)好者王文濤的博客文章《虛幻引擎 4 渲染流程分析》,這篇文章通過(guò) Renderdoc 的分析通俗地介紹虛幻引擎 4 的渲染過(guò)程。

 

      UE4作為當(dāng)今商業(yè)引擎界的大佬,渲染和圖形質(zhì)量一直是首屈一指的水準(zhǔn),但是相對(duì)于unity來(lái)說(shuō)UE4基本上是一套完整方案提供,不通過(guò)源碼修改對(duì)渲染進(jìn)行定制的可能性比較小,而且同時(shí)UE4這方面的文檔很少,因此這篇文章就是想通過(guò)分析UE4的渲染過(guò)程,來(lái)給大家針對(duì)自己使用ue4開(kāi)發(fā)的游戲的內(nèi)容特點(diǎn)做出優(yōu)化帶來(lái)啟發(fā)。

      我們使用Renderdoc對(duì)UE4(PC,DX11)截幀,UE4的版本為4.18. 可以看到UE4一幀畫(huà)面的渲染過(guò)程如下

 

145107y3oyc00vovchfcx3

 

      可以看到的是整個(gè)渲染流程還是很清晰明了的,接下來(lái)就會(huì)逐步分析每個(gè)過(guò)程。

 

1.Z-Prepass
UE4在deferred shading 過(guò)程之前這個(gè),會(huì)有一系列的culling過(guò)程剔除掉不需要的像素或者幾何體,基本上可以猜測(cè)是UE4是為了減輕后期在deferred shadinggbuffer 生成中的龐大計(jì)算量,第一遍的zpass會(huì)先渲染一遍場(chǎng)景中的幾何,用于生產(chǎn)SceneDepthZ以及HZB buffer,格式為R24G8TYPELESS

 

2.Compute light grid
在Pre-Z之后UE4會(huì)把場(chǎng)景中的燈光按照屏幕空間分成相應(yīng)的grid,類似于cluster shading的方法,注意這里的grid只考慮點(diǎn)光源,聚光燈,以及reflection captures,UE4這一步是通過(guò)compute shader實(shí)現(xiàn)的,所以只在sm>5.0的平臺(tái)上有。具體shader代碼在LightGridInjection.usf,閱讀代碼之后我們可以發(fā)現(xiàn) UE4的燈光空間grid的劃分是按照指數(shù)增長(zhǎng)的。也就是每個(gè)grid的z隨著距離會(huì)增長(zhǎng)。

在真正計(jì)算光照時(shí),我們可以用GridIndex來(lái)快速?zèng)Q定某點(diǎn)是否受到燈光影響。Lightculling的方法在forward下對(duì)于提高燈光的渲染效率是十分有用的,但UE4在DS下仍然保有了這一個(gè)過(guò)程。其效果存疑,初步推測(cè)是為了和UE4新加的Forward renderer統(tǒng)一。

 

3.Occlusion query
這一步在light culling之后,和Pre-Z pass 不同的是,Occlusion query 主要在物體級(jí)別做culling。ue4同樣使用的是hardware occlusion queries(GPU query)的技術(shù)。在這一個(gè)pass中,所有的不透明物體會(huì)被渲染為一個(gè)occluder(包圍盒):

 

145107p00w00ec5ue154da

在根據(jù)深度計(jì)算query之后,query的數(shù)據(jù)會(huì)傳回cpu,我們就可以計(jì)算每個(gè)物體有多少像素可見(jiàn)。這樣我們就能知道物體最終是否會(huì)被渲染。

在不透明物體的query pass之后。Unreal 還有一些其他的query pass,例如燈光(點(diǎn)光源)會(huì)有一個(gè)ShadowFrustumQUeries(一般是畫(huà)一個(gè)球體)反射則有 PlanarReflection queries(一般是畫(huà)一個(gè) Cube)

 

4.HZB generation
接下來(lái)UE4會(huì)生成場(chǎng)景的Hi-z(Hierarchical Z),R16_Float 格式,這一步也就是對(duì)之前的zbuffer做連續(xù)的downsample。HZB buffer會(huì)在之后的計(jì)算中起到很多作用,特別是Image based 的lighting技術(shù),例如SSR等等。

 

5.ShadowMap 渲染 
接下來(lái)的一步就是渲染shadowmap(shadowDepth,注意,這里指的是實(shí)時(shí)陰影的計(jì)算。根據(jù)UE4中燈光類型的不同,實(shí)時(shí)陰影的計(jì)算也有一定的差別。
UE4中的燈光類 型分為stationary, static,moveable三種,相應(yīng)的每種燈光cast realtime shadow的方式也不同。

對(duì)于stationary light,靜態(tài)物體的陰影會(huì)bake到static shadowmap,shadowmap只計(jì)算標(biāo)記為動(dòng)態(tài)物體的陰影,而對(duì)于dynamic light 會(huì)對(duì)所有物體投射陰影,而靜態(tài)燈光不會(huì)產(chǎn)生實(shí)時(shí)陰影。

ue4首先會(huì)渲染方向光的陰影,一般會(huì)渲染3split的cascade shadow ,所以我們能在截幀信息看到split0, split1和split2,注意cascade split數(shù)目在ue4中也是可以在方向光參數(shù)中設(shè)置的變量。

 

145107aai4prszgyp4tyri

 

之后是stationary light的shadow渲染,注意這里只針對(duì)場(chǎng)景中的moveable的物體。

最后是對(duì)于movable light的渲染,對(duì)于movable的方向光,ue4仍然是cascade shadow map計(jì)算陰影,需要注意的是對(duì)于movable的點(diǎn)光源,ue4使用了cubemap shadowmap,在cubeshadowmap的第一個(gè)pass CopyCachedShadowMap中,ue4會(huì)直接cachecopy static物體的shadowmap,例如這個(gè)場(chǎng)景中

 

145107os330cple77s7zy0

 

圓柱體為static,其他兩個(gè)物體設(shè)為movable,因此最后我們能看到Shadow 只畫(huà)了兩個(gè)幾何體。

 

 

145108y0d0p3jzp75j470p

 

最后動(dòng)態(tài)物體的shadow會(huì)添加在這個(gè)cubemap上面。

 

145108tll283dyblp3p1a8

145108sw4pnrztoa9na4oa

注意 shadowcubemap使用了geometry shader來(lái)選擇畫(huà)在那個(gè)面上。

 

6.G-prepass
其實(shí)在g-prepass之前還會(huì)渲染一個(gè)volumtric fog(如果場(chǎng)景中有的話) 這里我們先跳過(guò),
G-prepass就是ue4中常說(shuō)的basspass,這個(gè)bass會(huì)真正的渲染場(chǎng)景并產(chǎn)生我們?cè)赿eferred shading 中需要的G-buffers:

 

145109r7a2u4i5855aqq5h

 

SceneColorDefferd:包含了間接光照信息,例如lightmap和lightprobe(ue4叫ILC)

 

145109j2nbgfdfff2b7ee4

場(chǎng)景Normal

 

145109gkres65uprloj6cr

場(chǎng)景Albedo顏色

 

145109zltp7aezpzhlfpph

PBR Specular信息

 

除此之外還有針對(duì)特殊shading模型的特殊Custom Data RT(例如 頭發(fā)的tangent sss等)和Pre baked shadow factors RT,一般情況下UE4的渲染需要5-6個(gè)RT輸出,除了產(chǎn)生GBuffer的計(jì)算之外,在這一步UE4還會(huì)計(jì)算完間接光照的信息,主要包括采集lightmap信息(靜態(tài)物體)和球諧函數(shù)信息(Indirect lighting cache或者Volumetric light map)
UE4在4.18引入了新的半動(dòng)態(tài)光照技術(shù)也就是Volumetric lightmap,相比于之前的 ILC機(jī)制,Volumetric lightmap能夠更加細(xì)致的根據(jù)物體的空間位置對(duì)球諧函數(shù)probe做插值(ILC是每個(gè)物體做插值)

 

145109xarl00rdol9d0groVolumetric lightmap的Texture3d

 

7.Velocity rendering
在basepass之后是Velocity rendering,Velocity buffer會(huì)渲染為一張R16B16UNorm,主要用于motion blur和TAA

 

8.Pre-Lighting
UE4在這一部分會(huì)計(jì)算DeferredDecal(屏幕空間貼花),和AmbientOcclusion, UE4的屏幕空間AO考慮了深度和Normal信息,UE4的SSAO分為兩個(gè)Pass,第一個(gè)pass會(huì)計(jì)算一個(gè)四分之一分辨率的RT,使用的是四分之一分辨率的normal和depth, 注意這里就用了之前生成的HZB buffer,第二個(gè)pass會(huì)渲染一個(gè)全分辨率RT并與第一個(gè)combine.注意最后計(jì)算的結(jié)果會(huì)乘到SceneColorDeferred這個(gè)RT上.

 

145109oa9ls1rbankhd1eb

 

9.Lighting

接下來(lái)就是光照的渲染部分,UE4在渲染燈光光照時(shí)會(huì)先處理translucent 物體的照明。

在這之后會(huì)分別計(jì)算陰影燈光和非陰影燈光的standarddeferredlighting,

在這個(gè)pass之后,SceneColorDeferred RT就會(huì)包含最后直接光照的結(jié)果

 

145110sd5t5okpdto5pa81

 

10.ImageBased lighting

接下來(lái)UE4會(huì)渲染屏幕空間的一些光照效果,例如SSR(屏幕空間反射)還有ReflectionProbe等等

SSR會(huì)用到我們之前生成的HZB,在屏幕空間做Zbuffer的raymarching ,同時(shí)ue4的SSR會(huì)每幀jitter和TAA結(jié)合來(lái)提高質(zhì)量。當(dāng)擊中時(shí)SSR的shader會(huì)采樣上一幀的RT來(lái)獲得顏色

 

145110q8m28uoebewruezz

 

在SSR之后是ReflectionEnvironment Pass。這一步會(huì)結(jié)合場(chǎng)景中的反射球和之前的SSR結(jié)果會(huì)疊加到SceneColorDeferred這個(gè)RT中。

 

11. Post Processing
最后一步是UE4的Postprocessing,主要包括Temporal AA; Bloom;EyeAdaption等等這些可以自定義的內(nèi)容。

UE4 的TAA會(huì)經(jīng)歷兩個(gè)pass,第一個(gè)pass會(huì)處理沒(méi)被stencil的像素(例如有粒子特效的時(shí)候),會(huì)用到MainRT和velocity buffer,第二個(gè)pass會(huì)處理例如粒子這樣stencilled的pixel。兩個(gè)pass的區(qū)別在于混合當(dāng)前RT和History buffer的blendfactor的不同,第一個(gè)pass的blendfactor會(huì)根據(jù)pixel的亮度距離等等變化,而第二個(gè)pass的blendfactor嘖固定為0.25,也就是說(shuō)第二個(gè)pass的像素會(huì)更多考慮當(dāng)前像素,很可能這是為了減少TAA中很常見(jiàn)的ghosting effect

注意:TAA的處理只包含動(dòng)態(tài)的光照部分,也就是純動(dòng)態(tài)光照。

145110gy1vvvmweheu4mme

 

以上的分析還是省略了很多的細(xì)節(jié),例如半透照明這種還沒(méi)涉及。從整體的流程分析來(lái)看,UE4在設(shè)計(jì)渲染方案的時(shí)候還是最大限度的考慮了功能的最大化,UE4的DS renderer包含了非常齊全的光照特效,包括靜態(tài)的lightmap,動(dòng)態(tài)的lightprobe,屏幕空間的lighting,以及一些影視級(jí)別的渲染技術(shù),例如頭發(fā)的渲染模型等等,但同時(shí)為了功能UE4的計(jì)算任務(wù)是很繁重的,因此也就不難理解為什么UE4需要Pre-Z和Occlusion Culling去剔除掉不用的像素。當(dāng)然,對(duì)于使用UE4制作游戲的團(tuán)隊(duì)來(lái)說(shuō),根據(jù)游戲內(nèi)容特點(diǎn),畫(huà)面的藝術(shù)風(fēng)格,渲染管線都沒(méi)必要一成不變,例如對(duì)于一款開(kāi)放世界的野外生存游戲。我們可以考慮省掉Pre-Z的過(guò)程,或者,只用地表去畫(huà)Pre-Z,又或者對(duì)于NPR畫(huà)面的游戲我們完全可以不需要6-7個(gè)RT去做Deferred shading。UE4應(yīng)對(duì)這些定制化開(kāi)發(fā)的需求的方法就是:開(kāi)源。代碼就在DeferredShadingRenderer.cpp里。

 

相關(guān)文章
網(wǎng)友評(píng)論

您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)

關(guān)閉

全部評(píng)論:0條

推薦
熱門(mén)