URP | 后處理-自定義后處理

URP邏輯
主要是有3個模塊組成
Volume 模塊
這個就是后處理組件模塊

RenderFeature渲染器模塊

Pass模塊
是編輯后處理核心代碼類。
URP管線設(shè)置后處理
<aside> ?? 創(chuàng)建渲染管線
找到項目中正在使用的PiplineAsset文件(在Edit->ProjectSetting->Quality->Rendering下可以找到項目正在使用的渲染管線文件),如果沒有的話,新建一個Pipline Asset(Project下,右鍵Create->Rendering->URP->Pipline Asset),創(chuàng)建完成后,項目中除了PiplineAsset文件,還會多出一個Forward Renderer文件,在Forward Renderer文件中點擊Add Renderer Feature,就可以添加自定義的后處理效果了。
</aside>
渲染器

現(xiàn)在項目中沒有自定義后處理效果,創(chuàng)建一個。
創(chuàng)建Volume 模塊
我們調(diào)整后處理是在Volume組件調(diào)整,所以我們需要定義一個腳本把參數(shù)穿過來。
新建一個腳本,命名ColorTint 繼承 VolumeComponent類
注意:導(dǎo)入的命名空間是需要注意的。

效果

創(chuàng)建RenderFeature模塊
RenderFeature模塊 是用來設(shè)置Shader以及渲染大體邏輯的,
首先,新建一個繼承ScriptableRendererFeature的腳本,
ScriptableRendererFeature是URP提供給用戶用來擴展自定義渲染功能的入口
注意:導(dǎo)入的命名空間 ?using UnityEngine.Rendering.Universal。
這就是這個類最簡單的框架結(jié)構(gòu)。
效果

這里我們就是把新建的類,在ForwardRenderer里增加使用。
擴展這個類里自帶的倆個函數(shù)(Create 和 AddRenderPasses)是什么功能?
Create ?Feature被創(chuàng)建的時候調(diào)用,初始化。
AddRenderPasses 每幀都會調(diào)用,渲染攝像機內(nèi)容。
這里是把功能增加,沒有增加任何的實際效果代碼。
這里我們需要設(shè)置窗口,需要獲取當前的渲染邏輯和Shader
開方設(shè)置窗口
創(chuàng)建Pass,并且初始化隊列和Shader
把Pass增加到渲染隊列里
設(shè)置窗口
定義一個 Setting的
現(xiàn)在是設(shè)置完成,公開到界面上。
效果

定義Pass
定義一個Pass ,設(shè)置渲染Pass
前定義一個Pass
在Create里初始化屬性, 定義一個渲染顯示的名字。
注意:這里目前是前把Pass定義好,還沒有引入這里。
目前只是初始化,后面我們在AddRenderPasses里更新。
執(zhí)行PASS模塊
上面定義了渲染Pass,但是執(zhí)行Pass的類還沒有定義,所以報錯。
在文件下面,定義一個Pass
擴展ScriptableRenderPass這個類是什么?
這個類是可以設(shè)置渲染隊列的
這個類需要繼承一個 Execute(執(zhí)行)的方法函數(shù)
注意:必須重載一個名為Execute的方法,該方法便是邏輯執(zhí)行的地方。
定義需要的一些變量
定義構(gòu)造函數(shù)
判斷一下Shader是否為空
定義一個Setup函數(shù)初始化
在Pass里的算結(jié)束了,我們回到RenderFeature模塊。
Create( )函數(shù)
把ColorTintPass的 初始化Pass完成
上面已經(jīng)制作

效果

AddRenderPasses()函數(shù)
注意:如果出現(xiàn)錯誤檢查是否導(dǎo)入空間導(dǎo)致的。

上面已經(jīng)把初始化的內(nèi)容傳到渲染里了,我們下面開始寫具體執(zhí)行的內(nèi)容
Execute() 函數(shù)
這里是Unity提供給我們的父類函數(shù)Execute的方法,該方法便是邏輯執(zhí)行的地方。,這里我們重寫Execute函數(shù)。
判斷材質(zhì)是否為空

這里判斷是否為什么空,如果為空,提示錯誤。
判斷是否開啟后處理

渲染設(shè)置,獲取到我們的volume組件

擴展
定義函數(shù)的時候 void 和 override void 的區(qū)別?
上面我們可以看到定義函數(shù)有倆種方法一種是void,另一種是 override void
void 自定義函數(shù)方法。
override void ? 是父里已經(jīng)有這個函數(shù),使用(override void)這個重寫這個函數(shù)。 這里還有一個一種使用方法
使用 base 調(diào)用父類里的函數(shù)。
計算渲染
我們定義一個渲染函數(shù) Render()
這里主要是獲取場景渲染結(jié)果-在使用Shader進行調(diào)試輸出。
擴展
#region
#endregion
語法的使用方法。 可以把一個模塊合并起來查看方便

渲染模塊完成,在執(zhí)行階段調(diào)用渲染
Execute()函數(shù)完善
目前所有效果都完成,開始制作調(diào)色Shader
注意:Shader里的屬性和渲染調(diào)用里的變量名字需要一樣。

Shader部分
sdader就是最簡單的調(diào)整顏色Shader
我們目前有3個文件,倆個腳本文件,一個Shader文件。

渲染組件里指定Shader,也可以設(shè)置渲染層級

在Volume組件里調(diào)整 顏色,就可以看到效果了,

效果

總結(jié)
URP后處理是有4部分組成,
分別是渲染器(Forward Renderer)— 后處理(Volume) — Pass模塊 ?—Shader組成

腳本里主要模塊
ScriptableRendererFeature ?主要是有 設(shè)置模塊(Settings) ?初始化模塊(Create) 執(zhí)行邏輯模塊(AddRenderPasses)

ScriptableRenderPass ? ? ? 有4部分 ?設(shè)置渲染事件(ColorTintPass) ? ?初始化函數(shù)(Setup) ? ? 執(zhí)行函數(shù)(Execute) ? ? 渲染函數(shù)(Render)
