URP | 后處理-Bloom效果
后處理部分快完結(jié)了,
前看目錄

這部分前面是原來制作的一部分,參考
游戲 Bloom 實(shí)現(xiàn)方法 - 嗶哩嗶哩 (bilibili.com)
Unity 官方的Bloom就已經(jīng)很好了,這里只是學(xué)習(xí)方法原理
目的
Bloom的基本原理與效果
Bloom與HDR的關(guān)系
Bloom在URP中的實(shí)現(xiàn)過程
實(shí)現(xiàn)效果

Bloom基本原理
詳細(xì)介紹
游戲 Bloom 實(shí)現(xiàn)方法 - 嗶哩嗶哩 (bilibili.com)
這里直接制作過程

制作過程
這里直接URP實(shí)現(xiàn) ,
這是Unity 默認(rèn)

我們以這個(gè)效果為參考.
RendererFeature
前準(zhǔn)備一個(gè)基礎(chǔ)的后處理管線,可以實(shí)現(xiàn)Shader的效果,
基礎(chǔ)管線我們處理完成就,實(shí)現(xiàn)基礎(chǔ)的顯示Shader,我們接下來我們處理Shader。
Shader
因?yàn)槲覀兊腷loom分 4部分來,處理大部分都是在Shader階段處理。
Shader 部分的分成4個(gè)步驟流程
獲取當(dāng)前圖像亮度高的區(qū)域
Box模糊
使用疊加模式 和 Box模糊
模糊后的圖疊加到原圖
定義一個(gè)基礎(chǔ)Shader
這個(gè)Shader 是一個(gè)反色效果,是檢查我們當(dāng)前的管線是否正確。
這里Shader我們準(zhǔn)備執(zhí)行4個(gè)Pass來處理我們的不同階段。
1. 提取亮部信息
第一個(gè)Pass 類提取亮部信息。
定義一個(gè)函數(shù) 來提取亮部信息
在Pass里,使用函數(shù) 提取輸入的亮度信息。
Shader 第一個(gè)Pass 是提取亮度信息
在后處理組件中增加控制變量。
在后處理中增加我們的控制屬性
RendererFeature 中 來綁定我們的數(shù)據(jù)信息
管線中增加后處理關(guān)聯(lián)
效果

我們提取屏幕中顏色信息大于0.8 的數(shù)據(jù)
可以調(diào)整后處理中 Threshold數(shù)值控制提取亮部信息的大小

第一個(gè)Pass我們就算完成,我們看到有2個(gè)階段,

2. 模糊算法
我們新建一個(gè)Pass 來處理模糊,我們使用Box模糊方法
定義一個(gè)函數(shù) 來方便我們調(diào)用
注意:這里 t 是可以控制 模糊的大小
定義一個(gè)變量 來在外部控制模糊的大小
全Pass
擴(kuò)展 _MainTex_TexelSize.xy 和 _MainTex_ST 的區(qū)別
_MainTex_TexelSize
是貼圖 _MainTex 的像素尺寸大小,值: Vector4(1 / width, 1 / height, width, height)
_MainTex_ST
是貼圖_MainTex的tiling和offset的四元數(shù)
_MainTex_ST.xy 是tiling的值
_MainTex_ST.zw 是offset的值

3. 模糊和亮度疊加
為什么需要兩個(gè)模糊,第二個(gè)模糊是疊加模式 ,我們Bloom是有一個(gè)降采樣和升采樣的過程,這樣優(yōu)化疊加方式。
URP | 后處理-模糊算法總結(jié) - 嗶哩嗶哩 (bilibili.com)
修改疊加模式的Pass
我們第三Pass算完成了。接下來處理第四個(gè)Pass,把模糊完的圖和遠(yuǎn)場(chǎng)景的圖進(jìn)行疊加輸出
4. 合并輸出
最后面一個(gè)Pass 來處理 原圖和 模糊后的圖進(jìn)行合并。
shader部分完成,準(zhǔn)備4個(gè)Pass ,我們當(dāng)前是按照好理解的來處理,后面會(huì)合并優(yōu)化。
RendererFeature 實(shí)現(xiàn)效果
第一部分
提取亮度的Pass
Render
定義一個(gè)RT 來提取后面
這個(gè)部分就是獲取亮度信息,和上面的一樣。
后處理Volume 這里我們定義 控制降采樣的 次數(shù) 和控制模糊
第二部分
進(jìn)行降采樣和升采樣
獲取上面的信息進(jìn)行降采樣,實(shí)現(xiàn)模糊的效果,將源紋理降低一半分辨率,在使用降低一半的紋理放大到原始分辨率,就實(shí)現(xiàn)了模糊效果。
我們前把提取亮部信息的代碼注掉。
這部分可以查看怎么實(shí)現(xiàn)的降采樣方法。
注意:調(diào)用完RT 需要ReleaseTemporaryRT 進(jìn)行釋放。
效果

我們?cè)O(shè)置4次效果,執(zhí)行8次,4次降采樣 4次升采樣。
合并輸出
顯示出提取亮度,我們發(fā)現(xiàn)輸入的素材不是用來的素材圖,所以獲取用來的圖進(jìn)行合并。

在Shader中獲輸入的圖片,儲(chǔ)存到destination
SetGlobalTexture
SetGlobalTexture 是 Unity 中的一種方法,可以將紋理設(shè)置為全局紋理,可以在著色器代碼中被調(diào)用,或者在其他方法中使用。它接受兩個(gè)參數(shù):第一個(gè)參數(shù)是全局紋理的名稱,第二個(gè)參數(shù)是要設(shè)置的紋理。
Shader 里的全局屬性和局部屬性,
增加到Properties 就是局部屬性,Shader里使用?
沒有在 Properties ?里就是 ?全局屬性
注意:第4個(gè)Pass ?_SourceTex 是全局變量,不要增加到 屬性里。
查看Debug

全代碼
效果
到這里就算全實(shí)現(xiàn)完成

整合
我們把Shader整合一下,分成兩部分 第一個(gè)分 pass? 第二部分是 hlsl庫文件。
總結(jié)
梳理Bloom的流程,學(xué)習(xí)到了都分幾步部分實(shí)現(xiàn),官方流程也是4個(gè)Pass 不同的是 官方 第一個(gè)Pass提取亮度 第二個(gè),是水平模糊 第三個(gè)是垂直模糊,第四個(gè)是 上采樣。

2. 難點(diǎn)是在 降采樣和升采樣,我這里可能處理的比較復(fù)雜,目前沒有能力優(yōu)化的更好。
3. SetGlobalTexture 的使用,可以將紋理設(shè)置為全局紋理 。
資料
綻放 (catlikecoding.com)
【Unity】代碼實(shí)現(xiàn)后期處理Bloom效果 | SuzhiのBlog (1keven1.github.io)
Bloom_嗶哩嗶哩_bilibili
從認(rèn)識(shí)到實(shí)現(xiàn):HDR Bloom in Unity - 知乎 (zhihu.com)