在研究通過HDRP中自帶的Decal Projector Component組件來實(shí)現(xiàn)貼花效果的過程中弊添,遇到了一些需要理解的地方,以下列出一些關(guān)鍵步驟來說明貼花過程中的細(xì)節(jié)問題绩聘。
DBufferRender 階段
1. 根據(jù)渲染管線中貼畫的設(shè)置決定是否要使用四張RenderTexture作為渲染目標(biāo)斋荞。
2. 設(shè)置當(dāng)前渲染目標(biāo)并clear,使這些紋理有一個(gè)初始默認(rèn)顏色(60至75行)况毅。
3. 設(shè)置最終的渲染目標(biāo)為RTIDs數(shù)組(78行)恤批,其中對(duì)應(yīng)的紋理即是 _DBufferTexture0,?即是 _DBufferTexture1 和?即是 _DBufferTexture2(此處只用到三張紋理)异吻,可通過查看CreateBuffers方法中得知這三張紋理對(duì)應(yīng)的名稱是DBuffer0,DBuffer1 和?DBuffer2喜庞,和FrameDebug中顯示的信息相對(duì)應(yīng)涧黄。
4. 把m_HTile這張圖設(shè)置為可以在shader中被寫入(80行)赋荆。同時(shí)需要在shader中聲明對(duì)應(yīng)的可讀寫格式Texture笋妥,該聲明在ShaderVariablesDecal.hlsl文件中,同時(shí)每個(gè)Decal都會(huì)執(zhí)行到的frag函數(shù)(在ShaderPassDBuffer.hlsl文件中)中窄潭, 對(duì)_DecalHTile進(jìn)行寫入操作春宣,寫入的數(shù)據(jù)記錄了是否需要對(duì)Decal進(jìn)行 基礎(chǔ)顏色,法線以及法線遮罩計(jì)算的flag標(biāo)記嫉你。最后的判斷在 LitDecalData.hlsl 文件中的?ApplyDecalToSurfaceData 方法中進(jìn)行月帝。
5. 再把 m_HTile設(shè)置到名稱為 "_DecalHTileTexture" 的圖,
GBuffer 階段
1. ?frag方法在 ShaderPassGBuffer.hlsl 文件中幽污,通過獲取當(dāng)前surfacedata和貼畫的surfacedata嚷辅,通過計(jì)算把貼花的baseColor,normalWS距误,ambientOcclusion等屬性應(yīng)用到當(dāng)前畫面上簸搞。
2. 在獲取貼花surfacedata時(shí)用_DecalHTileTexture中的數(shù)據(jù)給 HTileMask?字段賦值扁位。HTileMask 字段在應(yīng)用貼花數(shù)據(jù)到當(dāng)前畫面時(shí)作flag位判斷用。
Enable Decal 的控制
使用HDRenderPipeline/Lit 時(shí)可以在inspector面板通過勾選 Enable Decal 選項(xiàng)來設(shè)置是否使用decal效果趁俊,接下來簡(jiǎn)要說一下代碼中是怎么通過這個(gè)選項(xiàng)來控制是否顯示貼畫的域仇。
"HDRenderPipeline/Lit" 這個(gè)shader使用了自定義的inspector面板顯示方式,通過一個(gè)叫 LitGUI的類來實(shí)現(xiàn)寺擂,
而 Enable Decal 這個(gè)選項(xiàng)在 LitGUI的父類即BaseLitGUI中定義暇务,
其對(duì)應(yīng)的ShaderProperty是 "_SupportDecals",
根據(jù)是否含有該屬性以及該屬性的值來設(shè)置名為 "_DISABLE_DECALS" 的?shader_feature怔软,
在最后混合decal數(shù)據(jù)和當(dāng)前表面數(shù)據(jù)時(shí)有兩個(gè)判斷條件來控制是否可以混合垦细,即?HAVE_DECALS 宏和?_EnableDecals變量,其中?HAVE_DECALS 宏的定義就和?_DISABLE_DECALS 有關(guān)挡逼,
至此可以搞清楚在材質(zhì)球的Inspector面板中控制的 "Enable Decal" 選項(xiàng)在shader中控制的是?HAVE_DECALS 這個(gè)宏括改。
?_EnableDecals 的控制
下面理清下?_EnableDecals 變量是從哪里控制的。全局查找 "_EnableDecals" 關(guān)鍵字發(fā)現(xiàn)在 DBufferManaget.cs 中通過SetGlobalInt方式來設(shè)置該屬性值挚瘟,
enableDecals變量是DBufferManager類的成員變量叹谁,在HDRenderPipeline.cs中的Render方法中被設(shè)置
可以看出控制條件是?hdCamera.frameSettings.enableDecals饲梭,看名稱應(yīng)該是攝像機(jī)相關(guān)的一些設(shè)置乘盖。
回到Unity界面中,查看攝像機(jī)的Rendering Path設(shè)置憔涉,如果是 Use Graphics Settings订框,則找到當(dāng)前使用的RenderPipeline物體,設(shè)置其 Rendering Passes 展開菜單中的 Decals ?選項(xiàng)兜叨;如果是 Rendering Path 設(shè)置是Custom穿扳,那么直接在當(dāng)前Inspector的Rendering Passes展開中找到Decals選項(xiàng)。這兩處Decals的設(shè)置對(duì)應(yīng)著代碼中的?hdCamera.frameSettings.enableDecals 值国旷。
總結(jié):
1. DBufferRender階段寫入_DecalHTile紋理矛物,存儲(chǔ)decal可以影響哪些表面數(shù)據(jù)的flag標(biāo)志位。
2. 把_DecalHTile紋理對(duì)應(yīng)的RenderTexture設(shè)置給_DecalHTileTexture紋理跪但。
3. GBuffer階段讀取_DecalHTileTexture紋理履羞,根據(jù)其值去對(duì)把decal屬性和當(dāng)前表面屬性進(jìn)行混合(baseColor,normalWS屡久,ambientOcclusion 或?specularColor忆首,metallic)。
4. 材質(zhì)球Inspector面板上的 Enable Decal 選項(xiàng)控制Shader中的?HAVE_DECALS 宏被环。
5. 攝像機(jī)Rendering Path設(shè)置中的Decals選項(xiàng)控制Shader中的_EnableDecals變量糙及。