貼花的一些細(xì)節(jié)補(bǔ)充

在研究通過HDRP中自帶的Decal Projector Component組件來實(shí)現(xiàn)貼花效果的過程中弊添,遇到了一些需要理解的地方,以下列出一些關(guān)鍵步驟來說明貼花過程中的細(xì)節(jié)問題绩聘。

DBufferRender 階段

1. 根據(jù)渲染管線中貼畫的設(shè)置決定是否要使用四張RenderTexture作為渲染目標(biāo)斋荞。

調(diào)用ClearAndSetTargets

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)涧黄。


設(shè)置多個(gè)RenderTexture作為渲染目標(biāo) ?
RenderTexture的名稱
DBufferRender中渲染的三張紋理,在GBuffer中被使用

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)行月帝。

設(shè)置m_HTile為可讀寫目標(biāo)
與m_HTile對(duì)應(yīng)的_DecalHTile
寫入_DecalHTile

5. 再把 m_HTile設(shè)置到名稱為 "_DecalHTileTexture" 的圖,

設(shè)置全局貼圖
PropertyID的聲明


GBuffer 階段

1. ?frag方法在 ShaderPassGBuffer.hlsl 文件中幽污,通過獲取當(dāng)前surfacedata和貼畫的surfacedata嚷辅,通過計(jì)算把貼花的baseColor,normalWS距误,ambientOcclusion等屬性應(yīng)用到當(dāng)前畫面上簸搞。

frag方法
應(yīng)用貼花的surfacedata到當(dāng)前surfacedata

2. 在獲取貼花surfacedata時(shí)用_DecalHTileTexture中的數(shù)據(jù)給 HTileMask?字段賦值扁位。HTileMask 字段在應(yīng)用貼花數(shù)據(jù)到當(dāng)前畫面時(shí)作flag位判斷用。

讀取_DecalHTileTexture紋理并給HTileMask字段賦值
用HTileMask字段作為flag標(biāo)記位對(duì)相應(yīng)屬性進(jìn)行操作


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 值国旷。

Decal的開關(guān)
Decal的開關(guān)


總結(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變量糙及。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市筛欢,隨后出現(xiàn)的幾起案子浸锨,更是在濱河造成了極大的恐慌唇聘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揣钦,死亡現(xiàn)場(chǎng)離奇詭異雳灾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冯凹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門谎亩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宇姚,你說我怎么就攤上這事匈庭。” “怎么了浑劳?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵阱持,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我魔熏,道長(zhǎng)衷咽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任蒜绽,我火速辦了婚禮镶骗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躲雅。我一直安慰自己鼎姊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布相赁。 她就那樣靜靜地躺著相寇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钮科。 梳的紋絲不亂的頭發(fā)上唤衫,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音绵脯,去河邊找鬼佳励。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桨嫁,可吹牛的內(nèi)容都是我干的植兰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼璃吧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼楣导!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畜挨,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤筒繁,失蹤者是張志新(化名)和其女友劉穎噩凹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毡咏,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驮宴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呕缭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堵泽。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恢总,靈堂內(nèi)的尸體忽然破棺而出迎罗,到底是詐尸還是另有隱情,我是刑警寧澤片仿,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布纹安,位于F島的核電站,受9級(jí)特大地震影響砂豌,放射性物質(zhì)發(fā)生泄漏厢岂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一阳距、第九天 我趴在偏房一處隱蔽的房頂上張望塔粒。 院中可真熱鬧,春花似錦娄涩、人聲如沸窗怒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至努隙,卻和暖如春球恤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荸镊。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工咽斧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躬存。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓张惹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親岭洲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宛逗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354