URP | 熱扭曲效果
內(nèi)容偏多,下圖是目錄

目的
URP管線下怎么獲取屏幕信息。
實現(xiàn)特效中使用的熱扭曲效果。
認(rèn)識攝像機輸出的不同階段效果圖。
概述
URP管線環(huán)境下,GrabPass是失效的。
在URP管線使用的OpaqueTexture 獲取不透明物體的繪制。

在shader Graph 里對應(yīng)的節(jié)點是 ?SceneColor

注意: OpaqueTexture只能渲染不透明物體。
透明物體是抓取不到的。

1.抓取不透明物體
聲明貼圖
設(shè)置貼圖
片元著色器階段輸出
計算出模型顯示UV坐標(biāo)

全代碼
效果


2.熱扭曲效果
制作原理,就是我們獲取到屏幕顏色以后,對屏幕顏色UV進行偏移達到扭曲的效果。
原來我們是扭曲紋理,就是對紋理坐標(biāo)UV扭曲。
現(xiàn)在我們獲取一張Niose紋理對屏幕UV扭曲。
輸入變量
輸入需要的變量

計算UV信息,輸出

片元著色器階段
前計算出不同的UV移動方向,
生成倆個扭曲的紋理,計算出不同的UV扭曲程度,
加到屏幕UV里。

計算遮罩,
我們輸出設(shè)置成遮罩,這樣我們就可控扭曲范圍大小。

效果


3.特效頂點Alpha可以控制扭曲
準(zhǔn)備好特效刀光貼圖

定義頂點輸入
在結(jié)構(gòu)體輸入,輸出,如果不清楚可以參考上面的文檔。
頂點著色器階段輸出

片元著色器階段
計算出倆個方向,使用頂點Alpha控制扭曲強度。
效果

能看到扭曲越來越弱。

擴展 :法線貼圖實現(xiàn)扭曲效果
準(zhǔn)備貼圖

修改變量
注意:法線貼圖使用**"bump" {} ?法線標(biāo)簽**
在片元著色器階段我們處理法線的方法。
這里和普通貼圖不一樣,使用一個內(nèi)置函數(shù),UnpackNormalScale 這函數(shù)是控制法線強度。
效果

代碼

4.半透明物體支持熱扭曲
上面方法是不支持半透明物體。但是我們特效中都是半透明物體。
怎么讓支持半透明物體扭曲。
思路
實際上URP管線中給我提供了很多COPY的圖,我們這里使用**_AfterPostProcessTexture**這張貼圖

這張圖是后處理完保存的一張圖。
然后利用RendererFeatures新建一個渲染時機 ,并新建一種LightMode Tags類型.
這樣所有Tags是Grab的shader都會在后期處理完成之后在渲染。
簡單理解:我們創(chuàng)建一個狀態(tài),讓這個狀態(tài)是在攝像機渲染完以后在渲染。
設(shè)置管線
找到URP管線設(shè)置——設(shè)置后處理資源



設(shè)置一個渲染狀態(tài)

獲取屏幕渲染出的一張圖。

設(shè)置疊加模式和渲染所有層,設(shè)置標(biāo)簽

設(shè)置相機
我們前面設(shè)置渲染狀態(tài)了,我們現(xiàn)在還需要創(chuàng)建一個攝像機。
這個攝像機是獲取主相機渲染的畫面。

設(shè)置管線,關(guān)閉所有渲染圖層。

擴展Overlay Camera 是將其視圖呈現(xiàn)在另一個攝影機的輸出之上的攝影機.
主相機里綁定 這個子相機

在FrameDebug里我們可以看到倆個攝像機,第二個攝像機就是看到前面渲染效果。

設(shè)置shader
定義渲染后處理圖

注意:這里是和上面不一樣的圖。
標(biāo)簽里修改渲染方式。

片元著色器階段,替換后處理素材。
效果
現(xiàn)在半透明物體也可以支持扭曲效果。

代碼
參考資料
1.人人有功練 Unity URP管線透明折射扭曲材質(zhì)的一系列實踐(一)兩種渲染時機的扭曲材質(zhì) - 知乎 (zhihu.com)
2. URP 系列教程 | 多相機玩法攻略 - 知乎 (zhihu.com)
5.擴展:渲染階段的輸出
CameraColorTexture 和 _CameraOpaqueTexture區(qū)別
在Debug狀態(tài)下查看這倆個


_CameraColorTexture ? 是場景渲染后生成的紋理截圖,
_CameraOpaqueTexture ?是在不透明物體渲染后截圖,所以截取不到透明物體。
AfterPostProcessTexture
_AfterPostProcessTexture 是后處理渲染結(jié)果輸出的圖。

問題:這三個階段渲染輸出的圖前后順序是什么?
第一,我們可以看到最前渲染的是CameraColorTexture

第二是 _CameraOpaqueTexture ? 不透明物體渲染后截圖

最后是后處理渲染出結(jié)果在輸出的圖。


總結(jié)
URP管線下怎么抓取渲染圖,默認(rèn)URP管線提供了設(shè)置,這里有倆個一個是獲取渲染圖,一個是渲染深度。

渲染結(jié)果輸出圖的認(rèn)識,會產(chǎn)生CameraColorTexture ,_CameraOpaqueTexture ? ,AfterPostProcessTexture ,他們的前后順序,具體什么情況使用上面圖。

變透明實現(xiàn)扭曲,是在管線里,增加一種狀態(tài),使用第二個攝像機渲染輸出AfterPostProcessTexture 圖。在進行扭曲處理。
在編輯窗口是有問題的,需要運行狀態(tài)查看效果。
