原文鏈接:https://docs.unity3d.com/Manual/RenderTech-DeferredShading.html
? ? ? ? 這一篇詳細(xì)介紹了延遲著色渲染路徑。請看維基百科:延遲著色(鏈接見原網(wǎng)頁)來獲取技術(shù)概況的介紹。
概況
? ? ? ? 當(dāng)使用延遲著色時,對于一個游戲物體可以被多少光照所作用沒有限制。所有的光照使用逐像素計(jì)算,這意味著它們都可以與法線貼圖等相交互。另外,所有光照都可以有緩存和陰影。
? ? ? ? 延遲著色具有優(yōu)勢,其處理光照的開銷與光照照射到的像素成比例。這取決于場景中光照值的大小,不論它照射了多少個游戲物體。因此,可以通過使光照變小提高性能。延遲著色也是高度一致的和行為可預(yù)測的。每個光照的影響都是逐像素計(jì)算的,所以沒有光照計(jì)算會拆分大的三角面。
? ? ? ? 劣勢方面,延遲著色并不真正支持抗失真,并且也不能處理半透明游戲物體(它們使用正向渲染)。其也不支持網(wǎng)格渲染器接收陰影的標(biāo)記,并且剔除遮罩僅僅以有限方式支持。您最多只能使用四個剔除遮罩。也就是說您的剔除遮罩層必須至少包含所有的層減去四個任意的層,所以32個層中必須要設(shè)置28個層。否則,您會得到圖形的假象。
要求
? ? ? ? 它需要支持多渲染目標(biāo)(MRT)的顯卡,Shader Model 3.0(或更高版本),并且支持深度渲染紋理。在2006年后生產(chǎn)的大多數(shù)PC顯卡支持延遲著色,以GeForce 8xxx,Radeon X2400,Intel G45開頭。
? ? ? ? 在移動平臺,延遲著色不被支持,主要是由于使用MRT格式(一些支持MRT的GPU也只是支持非常有限的位計(jì)算)。
? ? ? ? 請注意:當(dāng)使用正交投影時不支持延遲著色。如果攝像機(jī)的投影模式改成正交,那此攝像機(jī)也會退到正向渲染。
性能考慮
? ? ? ? 延遲著色的實(shí)時光照渲染開銷不取決于場景的復(fù)雜性,而是與被此光照照射到的像素?cái)?shù)量成比例。所以小的點(diǎn)光源或是聚光燈渲染的消耗是非常低的,而且如果它們完全或者部分的被場景中的游戲物體遮擋,那么它們的消耗會更低。
? ? ? ? 當(dāng)然,有陰影的光照比沒有陰影的光照性能消耗要高得多。在延遲著色中,投射陰影的游戲物體始終需要被投射陰影的光照渲染一次或更多次。更進(jìn)一步說,開啟陰影的光照shader的渲染開銷要比不使用陰影的更高。
實(shí)現(xiàn)細(xì)節(jié)
? ? ? ? 有不支持延遲著色shader的物體在延遲著色完成后,使用正向渲染路徑。
? ? ? ? 幾何Buffer(g-buffer)中的渲染目標(biāo)(RT0-RT4)的默認(rèn)布局列在了下面。數(shù)據(jù)類型被放在每個渲染目標(biāo)的不同通道中。使用的通道顯示在圓括號中。
·RT0, ARGB32格式:漫反射顏色(RGB),遮擋(A)。
·RT1, ARGB32格式:高光反射顏色(RGB),粗糙度(A)。
·RT2, ARGB2101010格式:世界空間法線(RGB),未使用(A)。
·RT3, ARGB2101010(非HDR)或ARGBHalf(HDR)格式:自發(fā)光+光照+光照貼圖+反射探頭buffer。
·深度+模板buffer。
? ? ? ? 所以默認(rèn)的g-buffer布局是160位/像素(非HDR)或是192位/像素(HDR)。
? ? ? ? 如果混合光照使用陰影遮罩或距離陰影遮罩模式,則要使用第五個目標(biāo):
·RT4,ARGB32格式:光照遮擋值(RGBA)。
? ? ? ? 那么這樣g-buffer布局是160位/像素(非HDR)或是192位/像素(HDR)。
? ? ? ? 如果硬件不支持五個并發(fā)渲染目標(biāo),那么使用陰影遮罩的物體將回退到正向渲染路徑。當(dāng)攝像機(jī)不使用HDR時,自發(fā)光+光照buffer(RT3)會被對數(shù)的編碼來提供比通常可能的ARGB32紋理更大的動態(tài)范圍。
? ? ? ? 請注意,當(dāng)攝像機(jī)使用HDR渲染時,沒有為自發(fā)光+光照buffer(RT3)創(chuàng)建單獨(dú)的渲染目標(biāo)。而是把攝像機(jī)渲染到的(也就是說,其被傳遞到圖片效果)作為RT3使用。
G-Buffer pass
? ? ? ? G-buffer pass渲染每個游戲物體一次。漫反射和高光顏色,表面平滑,世界空間法線和自發(fā)光+環(huán)境光+反射+光照貼圖被渲染到G-buffer紋理中。G-buffer紋理被設(shè)置為全局shader屬性以便后面的shader調(diào)用(CameraGBufferTexture0 .. CameraGBufferTexture3 名字)。
光照pass
? ? ? ? 光照pass基于g-buffer和深度計(jì)算光照。光照在屏幕空間中計(jì)算,所以其執(zhí)行花費(fèi)的時間是基于場景復(fù)雜度。光照被添加到自發(fā)光buffer。
? ? ? ? 不通過攝像機(jī)近截面的點(diǎn)光源和直射光作為3D圖形來渲染,并進(jìn)行深度測試來決定是否在場景中啟動。這使得部分或完全被遮擋的點(diǎn)光源或直射光渲染的代價(jià)非常低。平行光和平通過近截面的點(diǎn)光源和直射光被作為全屏四邊形來渲染。
? ? ? ? 如果一個光照啟用陰影,那么這些陰影也將在這個pass中進(jìn)行渲染和應(yīng)用。請注意陰影不是免費(fèi)的,陰影投射器需要被渲染,并且一個更復(fù)雜的光照shader必須被應(yīng)用。
? ? ? ? 唯一可用的光照模型是Standard。如果想用一個不同的模型,您可以更改光照pass shader,通過將修改版本的Internal-DeferredShading.shader文件從內(nèi)置shader文件夾中放置到Assets文件夾下的Resources文件夾中。然后到Edit->Project Settings->Graphics窗口,選擇Deferred下拉框中的Custom Shader。然后選擇看起來是您正在使用的shader的shader選項(xiàng)。