URP | 后處理-亮度飽和度對(duì)比度

目的
梳理一遍后處理3大模塊Shader,Volume,渲染功能腳本.
Volume的使用方法。
ScriptableRenderPass 類 和ScriptableRendererFeature類
Shader
前準(zhǔn)備一個(gè)Shader,定義3個(gè)變量控制亮度 飽和度 對(duì)比度
這部分Shader準(zhǔn)備完成,
Volume
我們需要把Shader的數(shù)據(jù)傳到Volume組件里,所以我們定義一個(gè)類,控制Shader的屬性。
新建一個(gè)Volume腳本
這個(gè)是基礎(chǔ) ,我們需要增加IsActive(),是開啟后處理開關(guān)。
我們輸入要控制的屬性
這里默認(rèn)是1 ,
效果展示

擴(kuò)展 還有哪些定義變量的方法。
Volume 的所有屬性
自定義變量屬性方法

渲染腳本類
上面?zhèn)z部分準(zhǔn)備好,我們需要把這兩個(gè)屬性關(guān)聯(lián)起來。
我們新建一個(gè)渲染模塊,可以在渲染器里調(diào)用。
ScriptableRendererFeature
新建一個(gè)腳本,繼承ScriptableRendererFeature
我們使用ScriptableRendererFeature來實(shí)現(xiàn)這一點(diǎn)。ScriptableRendererFeature是URP開放給用戶用來擴(kuò)展自定義渲染功能的入口,我們自己新建類繼承它,其結(jié)構(gòu)如下
RenderPass
定義渲染Pass
這個(gè)腳本方法主要有3個(gè) Setup,Execute和Render

定義 一個(gè)Pass
需要默認(rèn)帶一個(gè)Execute方法
創(chuàng)建需要的屬性
ColorAdjustment ? Volume屬性參數(shù)組件
m_Material ? ?用于后處理的材質(zhì),cmd.Blit()方法需要調(diào)用的參數(shù)
Setup ?| 初始化
對(duì)輸入的紋理,材質(zhì)進(jìn)行初始化
初始化輸入紋理,
初始化輸入的材質(zhì)屬性
Execute | 執(zhí)行
修改Execute方法,在方法中我們通過VolumeManager.instance.stack單例獲取Volume框架中所有的堆棧,在從堆棧中獲取我們上一補(bǔ)創(chuàng)建的屬性參數(shù)組件,由于Execute是每幀調(diào)用,所有該組件也是實(shí)時(shí)更新的。
然后我們使用標(biāo)簽名獲取一個(gè)命令緩沖區(qū),將該命令緩沖區(qū)與Execute的參數(shù)RenderingData渲染信息一起交給Render方法進(jìn)行后處理。
在后處理完成后我們調(diào)用context.ExecuteCommandBuffer(cmd);方法執(zhí)行該命令緩沖區(qū),最后釋放內(nèi)存。
這里我們需要調(diào)用Render 渲染函數(shù), ?我們需要自定義一個(gè)渲染方法。
Render
在Render方法中我們獲取屬性參數(shù)組件中的參數(shù),賦值給材質(zhì)。
前判斷組件是否開啟,
注意:這里是把Shader的屬性和Volume變量關(guān)聯(lián)起來
Renderer Feature 函數(shù)
在RendererFeature處理Pass 的屬性
設(shè)置三個(gè)參數(shù),公開屬性Shader、私有屬性AdditionPostProcessPass對(duì)象和材質(zhì)
我們這里是使用材質(zhì)計(jì)算的,第一個(gè)是輸入的Shader,在轉(zhuǎn)成材質(zhì)計(jì)算。
Create方法中初始化內(nèi)容
我們定義的Pass初始化到PostPass,在設(shè)置渲染層級(jí)
效果

AddRenderPasses 方法
中通過Shader創(chuàng)建材質(zhì),然后獲取當(dāng)前渲染結(jié)果。
然后在把當(dāng)前渲染的結(jié)果和我們的材質(zhì)傳入 Pass中,渲染結(jié)果輸出。
前判斷Shader是否為空
檢測(cè)到有Shader創(chuàng)建材質(zhì)。
獲取當(dāng)前渲染結(jié)果
傳入Pass處理修改
這里我們獲取到輸入顏色信息,在獲取到材質(zhì)信息,那就可以執(zhí)行Pass。
效果完成

使用我們的后處理調(diào)整效果

總結(jié)
RenderPass 是計(jì)算渲染的內(nèi)容,RenderFeature模塊是輸入Shader,調(diào)用Pass去執(zhí)行結(jié)果。

Shader和Volume組件的屬性是在Render 渲染里關(guān)聯(lián)起來的,使用SetFloat方法

這里還有那些設(shè)置屬性

執(zhí)行順序
是前執(zhí)行RendererFeature模塊—調(diào)用Create方法初始化—AddRenderPasses方法(每幀執(zhí)行)
-—調(diào)用Pass里Setup方法——調(diào)用Pass增加到渲染隊(duì)列里。
全代碼