URP | 后處理-模糊算法總結(jié)
內(nèi)容偏多?

目的
URP管線下怎么計算后期模糊效果。
模糊算法的學(xué)習(xí)使用。
都有那些模糊算法,都有哪些優(yōu)點。
模糊介紹
目前看到大佬總結(jié)的十種模糊的方式,實現(xiàn)經(jīng)常使用的幾種。
高品質(zhì)后處理:十種圖像模糊算法的總結(jié)與實現(xiàn) - 知乎 (zhihu.com)
主要模糊方式
10種模糊方式對比

性能測試
不同模糊性能對比。

思路
URP后處理主要有4部分組成

主要是由3個文件組成,
Shader文件
Volume 腳本
這個是暴露給后處理使用的腳本、
RenderFeature 腳本
這個腳本主要包含 RenderFeature模塊和 ScriptableRenderPass模塊 倆部分。主要是處理渲染邏輯的。

Gaussian Blur | 高斯模糊
高斯模糊主要分為橫模糊和縱模糊,倆次模糊以后就可以得到結(jié)果了。
對圖像處理的矩陣稱之為高斯核(Gaussian Kernel)

詳細 參考
高品質(zhì)后處理:十種圖像模糊算法的總結(jié)與實現(xiàn) - 知乎 (zhihu.com)
Shader處理
創(chuàng)建一個Shader,在創(chuàng)建一個函數(shù)庫,命名Blur.hlsl

Shader內(nèi)導(dǎo)入函數(shù)庫就可以了,
函數(shù)庫里增加計算
定義我們的片元著色器(Gaussianfrag),
注意:因為我們要制作不同的模糊效果使用一個hlsl.函數(shù)庫,調(diào)用不同的片元著色器,執(zhí)行不同的效果。
擴展 卷積核是什么?
三分鐘徹底理解圖像高斯模糊 - 知乎 (zhihu.com)
卷積究竟卷了啥?——17分鐘了解什么是卷積_嗶哩嗶哩_bilibili
游戲 Bloom 實現(xiàn)方法 - 嗶哩嗶哩 (bilibili.com)
Volume
創(chuàng)建一個腳本在后處理里控制屬性
后處理效果

RendererFeature 類
創(chuàng)建一個腳本,命名 GaussianBlurRenderFeature
RenderFeature是處理渲染邏輯,設(shè)置Shader
設(shè)置渲染事件
同步渲染事件
執(zhí)行函數(shù),傳入Volume,傳入Command
渲染Render函數(shù),后處理邏輯。
公開設(shè)置
外部可以設(shè)置渲染層級,指定Shader,
URP | 后處理-自定義后處理 - 嗶哩嗶哩 (bilibili.com)
定義Pass我們創(chuàng)建的Pass 開始同步渲染方式。
PASS部分
渲染事件
我們開始處理Pass階段的渲染內(nèi)容,
創(chuàng)建一個類, 創(chuàng)建構(gòu)造函數(shù)。
就是上面調(diào)用的構(gòu)造函數(shù)設(shè)置的層級和Shader
我們現(xiàn)在定義一些變量,比如Shader的材質(zhì),控制模糊的變量等。
我們回到到構(gòu)造函數(shù),判斷Shader是否為什么空,如果不為空創(chuàng)建一個材質(zhì)。
初始化渲染
定義一個Setup函數(shù) ,初始化渲染目標(biāo)
回到RendererFeature 初始化
初始化完成,
執(zhí)行
主要是判斷 材質(zhì),攝像機, 組件是否準(zhǔn)備好,準(zhǔn)備好執(zhí)行渲染。
注意:這里的 Render 函數(shù)還沒有定義
接下來定義渲染部分。
渲染
渲染
執(zhí)行渲染渲染計算,
注意:GetTemporaryRT 是括號括號括號,這樣處理是為了看的清楚。
計算完,傳入材質(zhì)
我們使用 BlurTimes 控制迭代次數(shù)。
擴展 Blit 函數(shù)的使用用法、
這個表示 后面是表示使用的Shader中第幾個Pass 。
Blit函數(shù)的使用
官方函數(shù)介紹

最簡單的作用就是把一張紋理繪制到另一張紋理中,可以使用材質(zhì)對紋理進行處理。
效果
處理效果

注意:迭代次數(shù)越多越費。
代碼
shader
hlsl
Volume
Feature

Box Blur | 方框模糊
Box模糊和 上面的 高斯模糊差不多,

主要是他們的計算 高斯核不一樣。
注意:方框模型和高斯模糊都使用同樣的渲染管線就可以,只需要修改Shader就可以,他們指定不同的Shader就可以。

Shader
Shader階段需要注意的是,定義新的片元著色器,指定我們調(diào)用的函數(shù)庫的位置。

調(diào)用 Box Frag 片元著色器
hlsl
主要是定義一個新的 片元著色器,命名— Box Frag.
擴展 倆種模糊方式的對比效果。
方框模糊
Blur Times 6 ? ? ?Blur Range ?2 ? ? RT Down Sampling ? ?3

高斯模糊

第二步 實現(xiàn)同樣類似的模糊,看倆種模糊的算法對比。
這是倆種差不多的模糊,


總結(jié):方框模糊比高斯模糊迭代次數(shù)少, 優(yōu)點就是比高斯模糊省。

Kawase Blur
Kawase Blur于Masaki Kawase 在GDC2003的分享《Frame Buffer Postprocessing Effects in DOUBLE-S.T.E.A.L (Wreckless)》中提出。
Kawase Blur最初用于Bloom后處理特效,但其可以推廣作為專門的模糊算法使用,且在模糊外觀表現(xiàn)上與高斯模糊非常接近。
Kawase Blur的思路是對距離當(dāng)前像素越來越遠的地方對四個角進行采樣,且在兩個大小相等的紋理之間進行乒乓式的blit。
創(chuàng)新點在于,采用了隨迭代次數(shù)移動的blur kernel,而不是類似高斯模糊,或box blur一樣從頭到尾固定的blur kernel。

優(yōu)點:Kawase Blur比經(jīng)過優(yōu)化的高斯模糊的性能約快1.5倍到3倍。
Shader
我們前在blur.hlsl計算片元著色器
對像素斜四角像素進行采樣,然后取平均值。
注意:第一個是主像素的位置,剩下4個是4個點的像素。
Shader
RenderFeature 類
我們前創(chuàng)建渲染流程
這個階段是把 destination的效果輸出到屏幕,降采樣和 模糊起作用了,我接下來處理核心代碼。
創(chuàng)建2個RT 我們需要來回切換。
這個階段主要是注意,2個RT來回切換。
在模糊迭代開始,材質(zhì)我們需要使用迭代次數(shù)來控制模糊次數(shù)

來回Blit處理

當(dāng)前迭代次數(shù),對每次模糊的半徑進行設(shè)置

效果

屬性數(shù)值

這樣迭代2次就有一個不錯的模糊效果。
KawaseBulrRenderFeature

Dual Kawase Blur ?| 雙重模糊
上面這些模糊算法我們可以看出,一旦模糊距離增大,必須得加大迭代次數(shù)來消除方格感。
Dual Blur 是利用降采樣和升采樣,解決方格感,還有Dual Blur方式在頂點著色器階段對UV進偏移。這樣可以減少計算量。
一個降采樣,一個升采樣。


Shader
Shader部分,我們是使用倆個Pass完成,
為了帶來更好的性能表現(xiàn),可以將uv的偏移放在Vert Shader中進行,而Fragment Shader中基本上僅進行采樣即可。
DualKawaseBlur.hlsl
需要重新定義頂點結(jié)構(gòu)體,
我們準(zhǔn)備倆個輸出結(jié)構(gòu)體,一個降采樣,一個升采樣。
降采樣 ? ? ?第一個UV 一個是定義 5 的數(shù)組
升采樣 ? ? 第二個UV需要定義8個的 數(shù)組。

降采樣
頂點著色器是對UV進行偏移。
升采樣
頂點著色器
Shader部分
定義2個Pass
RendererFeature 類
因為我們都是使用的一個 Volume,所以我們調(diào)用同一個 組件,
這里只是 設(shè)置好渲染內(nèi)容,
我們要定義 Pass 設(shè)置渲染邏輯
Pass
Render
這個部分是我們的算法核心,
渲染效果


全代碼
擴展 RT是什么?
URP源碼學(xué)習(xí)(七)一些細節(jié)和理解 - 知乎 (zhihu.com)
首先rt是一張?zhí)厥赓N圖,這張貼圖對應(yīng)的是GPU上的FrameBuffer.
FrameBuffer 緩存區(qū)儲存2種緩存
顏色緩存,
深度緩存

到這里4種模糊算法算完事,
擴展:怎么查看Frame Debug
我們看到渲染結(jié)果,

這個是原圖要輸出的顯示效果,
這個是沒有增加后處理的原圖備份。

這些是計算模糊的過程階段圖。

最后輸出到屏幕處理結(jié)果圖。

總結(jié)
高速模糊最簡單,Box模型也只是在Shader階段進行處理,最復(fù)雜的是 Dual 和Kawase 模糊方式, 相對Dual 性能更好。
從細節(jié)梳理了后處理渲染流程,創(chuàng)建成模板,好維護處理。
對RT的類整理學(xué)習(xí),經(jīng)常使用的類型
Blit 函數(shù)
一個紋理復(fù)制到另一個紋理。

GetTemporaryRT
設(shè)置RT的屬性

RenderTargetIdentifier
臨時紋理的一些屬性

RenderTextureDescriptor
RT的一個類包含RT的所有屬性

資料
URP Gaussian/Box/Kawase/Dual Blur 實現(xiàn) - 知乎 (zhihu.com)
Unity URP DualKawaseBlur TA (tajourney.games)
高品質(zhì)后處理:十種圖像模糊算法的總結(jié)與實現(xiàn) - 知乎 (zhihu.com)
【Free Bird/URP教學(xué)】7.URP后處理--高斯模糊 - 知乎 (zhihu.com)
【Unity ShaderGraph UI模糊特效教程】_嗶哩嗶哩_bilibili