基礎(chǔ)知識(shí)-貼花Actor

延遲貼花(Deferred Decal)提供了更好的性能和維護(hù)性。通過(guò)寫(xiě)入GBuffer而非重新計(jì)算光照,它具備了幾點(diǎn)優(yōu)勢(shì):
許多光源的性能變得更加可預(yù)測(cè),因?yàn)閷?duì)光源數(shù)量或類型沒(méi)有限制(所有光源都使用相同的代碼路徑)
使用屏幕空間遮罩時(shí),還可以實(shí)現(xiàn)一些在其他情況下很難實(shí)現(xiàn)的效果(比如潮濕層)。
貼花的渲染方式是,在貼花影響區(qū)域的周圍的一個(gè)方框中渲染。
在關(guān)卡中添加貼花
在場(chǎng)景中添加貼花的方法是:在?內(nèi)容瀏覽器(Content Browser)?中選擇合適的貼花材質(zhì),然后在視口中?右鍵單擊,在上下文菜單中選擇?放置Actor(Place Actor)。然后可以使用變形工具調(diào)整貼花的大小和方向。?

調(diào)整大小、平鋪次數(shù)和偏移
創(chuàng)建貼花后,你可以使用平移和旋轉(zhuǎn)控件對(duì)其進(jìn)行定位和定向。

非等分縮放控件(non-uniform scaling widget)能控制貼花體積的寬度、高度和遠(yuǎn)平面距離。
延遲貼花屬性
延遲貼花只有幾個(gè)屬性:
材質(zhì)(Material)
此屬性定義了貼花的材質(zhì)。
排序順序(Sort Order)
此屬性允許用戶控制多個(gè)貼花堆疊時(shí)的排序方式。值越高,越在頂部渲染。
設(shè)置排序值時(shí),請(qǐng)小心操作。如果在大量不同貼花上設(shè)置大量排序值,可能會(huì)導(dǎo)致貼花無(wú)法按狀態(tài)排序,從而損害性能。
材質(zhì)設(shè)置
DecalBlendMode?定義了如何將材質(zhì)屬性(漫反射、鏡面反射、法線、不透明度...)應(yīng)用到GBuffer。?
不透明度用于混合貼花的貢獻(xiàn)。一個(gè)高效貼花只會(huì)處理少量的GBuffer屬性。 我們當(dāng)前優(yōu)化的案例由以下其他模式表示:DBM_Diffuse、DBM_Specular、DBM_Emissive、DBM_Normal。
半透明(Translucent)
它將混合完整材質(zhì),更新GBuffer,不適用于烘焙光照。
染色(Stain)
它將調(diào)制基色(Modulate BaseColor),混合其余部分,更新GBuffer,不適用于烘焙光照。
法線(Normal)
它將僅混合法線,更新GBuffer,不適用于烘焙光照。
自發(fā)光(Emissive)
它僅適用于附加自發(fā)光。
DBuffer_半透明顏色、法線、粗糙度(DBuffer_Translucent Color, Normal, Roughness)
它適用于非金屬,也可以放入DBuffer中用于烘焙光照。如果沒(méi)有連接法線,那么它將成為DBM_TranslucentNormal。
DBuffer_半透明顏色(DBuffer_Translucent Color)
它適用于非金屬,也可以放入DBuffer中用于烘焙光照。
(DBuffer_半透明顏色、法線)DBuffer_Translucent Color, Normal
它適用于非金屬,也可以放入DBuffer中用于烘焙光照。如果沒(méi)有連接法線,那么它將成為DBM_DBuffer_Color。
DBuffer_半透明顏色、粗糙度(DBuffer_Translucent Color, Roughness)
它適用于非金屬,也可以放入DBuffer中用于烘焙光照。
DBuffer_半透明法線(DBuffer_Translucent Normal)
它適用于非金屬,也可以放入DBuffer中用于烘焙光照。
DBuffer_半透明法線、粗糙度(DBuffer_Translucent Normal, Roughness)
它適用于非金屬,也可以放入DBuffer中用于烘焙光照。如果沒(méi)有連接法線,那么它將成為DBM_DBuffer_Roughness。
DBuffer_半透明粗糙度(DBuffer_Translucent Roughness)
它適用于非金屬,也可以放入DBuffer中用于烘焙光照。
(實(shí)驗(yàn)性)體積距離函數(shù)(Volumetric Distance Function (experimental))
它將根據(jù)LightVector在不透明度中輸出一個(gè)有向距離。
DBM_ScreenSpaceMask?比較特殊,因?yàn)樗梢杂绊懸粋€(gè)特殊的遮罩通道,即SSAO當(dāng)前使用的通道(環(huán)境遮擋)。這使貼花能夠覆蓋或淡化某些區(qū)域的作用。
DBM_DiffuseSpecularEmissive?是影響多個(gè)GBuffer通道的模式。
注意,材質(zhì)混合模式也會(huì)影響GBuffer值的混合方式。因此,可以將漫反射的顏色相乘。
你可以使用GBuffer視圖模式檢查逐像素存儲(chǔ)的GBuffer值。
貼花本地位置是0到1范圍內(nèi)的第3個(gè)位置。紋理UV給出了x和y分量。如果你需要z分量,你可以連接一個(gè)CameraVector節(jié)點(diǎn)來(lái)獲得所有3個(gè)矢量分量。
性能
受貼花影響的對(duì)象的網(wǎng)格體復(fù)雜性不影響性能。貼花的性能取決于著色器的復(fù)雜性和屏幕上的著色器邊框的大小。
我們可以進(jìn)一步提高每個(gè)貼花的性能。在理想情況下,貼花的邊框較小,以獲得更好的像素性能。這可以手動(dòng)實(shí)現(xiàn)。雖然自動(dòng)化的方法是可行的,但是優(yōu)秀的設(shè)計(jì)人員也可以通過(guò)調(diào)整布局來(lái)進(jìn)一步提高性能。
視圖模式?ShaderComplexity(編輯器UI或"viewmode ShaderComplexity")可以用來(lái)查看對(duì)像素著色成本的影響,它使用一個(gè)像素著色器成本進(jìn)行估算,并在多個(gè)貼花重疊時(shí)累加。 目前,貼花遮罩功能在這方面沒(méi)有效果(由于使用了模板硬件特性,遮罩部件應(yīng)該有較低的固定成本)。 以下顯示了沒(méi)有貼花時(shí)(左圖)、帶有貼花時(shí)(右圖)、在法線渲染模式下時(shí)(上圖)以及啟用ShaderComplexity時(shí)(下圖)的場(chǎng)景:

顏色越深,表示這些像素的性能成本越高。這些信息可以用來(lái)優(yōu)化正確的著色器,去除幾乎不可見(jiàn)的貼花或更有效地放置它們。
當(dāng)前局限
我們目前只支持延遲貼花,而且它們只對(duì)靜態(tài)對(duì)象有效。
法線混合當(dāng)前不能圍繞對(duì)象。
流送尚未連接,所以請(qǐng)確保紋理沒(méi)有流送。
遮罩貼花(不影響其他對(duì)象)沒(méi)有完全實(shí)現(xiàn)。
2x2區(qū)塊瑕疵修復(fù)
貼花的邊緣可能有2x2像素塊瑕疵,如下面的截圖所示。

這正是節(jié)點(diǎn)"貼花導(dǎo)數(shù)(Decal Derivative)"的用武之地。必須小心使用這個(gè)節(jié)點(diǎn),因?yàn)樗鼘?duì)性能有很大的影響。它返回各向異性紋理過(guò)濾所必需的貼花的默認(rèn)紋理坐標(biāo)在X軸和Y軸上的導(dǎo)數(shù),但計(jì)算方法與使用硬件的默認(rèn)節(jié)點(diǎn)和DDX/DDY節(jié)點(diǎn)不同,以避開(kāi)這個(gè)2x2像素塊瑕疵。

使用它可以修復(fù)受益于它的貼花上的瑕疵。

當(dāng)前局限
DecalMipmapLevel不支持自定義UV,但你可以修補(bǔ)它的輸出。