URP | Deacl 貼花效果

效果
貼花效果

實現(xiàn)原理
前計算出裁剪空間位置信息,轉(zhuǎn)換到世界空間
計算世界空間的位置信息。 做一個透視除法,轉(zhuǎn)換到物體空間。
在物體空間內(nèi)部,計算出場景物體相交的物體。
在物體空間內(nèi)部,輸入紋理平鋪到世界空間什么方向(Z)。
Shader Graphs實現(xiàn)
使用深度計算出相交

計算出顯示,顯示范圍有多大

計算紋理UV

代碼實現(xiàn)
準備基礎(chǔ)Shader
頂點著色器
片元結(jié)構(gòu)體 增加我們需要的屬性
輸出
sstexcoord ? ? ? ? ? ? ? ? ?屏幕UV
cam2vertexRayOS ? ? ?相機空間的射線
cameraPosOS ? ? ? ? ? ? 相機空間下模型頂點位置
獲取深度圖

頂點著色器階段
計算出屏幕UV[0-1]
計算相機空間下的模型頂點坐標
注意:相機空間轉(zhuǎn)換到模型空間下,使用了V的逆矩陣和M的逆矩陣進行計算,但是它是向量,所以得忽略掉平移矩陣,故float4(posVS.xyz,0)后面得取0,而不是1。
擴展 空間轉(zhuǎn)換方式
我們?nèi)〉降哪P涂臻g下的射線,它是模型的頂點從模型坐標系轉(zhuǎn)到相機坐標系下,然后忽略了平移矩陣后,又從相機坐標系轉(zhuǎn)回模型坐標系。那有沒有這種可能,只計算模型坐標系轉(zhuǎn)到相機坐標系的平移矩陣,不用費力繞了一大圈又計算回來?我們可以自行推導該想法的正確性。
先說明下這里需要使用的矩陣。

然后我們的射線Ray和模型頂點坐標POS的計算式如下

這里看似可以直接把對應的矩陣直接消掉
片元著色器
前獲取屏幕深度
cam2vertexRayOS 檢測射線,需要透視除法。
在計算出 貼花空間的坐標= 模型空間的相機坐標+模型空間的射線 * 屏幕深度
效果

移動物體,我們可以看到UV在變化。

? ? 本質(zhì)是和模型坐標系一致,不過它是沿著屏幕深度進行貼合采樣。
我們在看一下,發(fā)現(xiàn)這個uv和我們貼圖UV是不一致的,那怎么解決這個問題。

效果

我們目前看到,UV平鋪出去了,所以,我們需要裁減一下。
創(chuàng)建一個Mask 裁減掉不需要的
效果

然后放到立體的側(cè)面的時候,會出現(xiàn)拉伸這不是我們想要的。

那我們在做一個限制
效果

整理
我們是在alpha處理調(diào)整
整理到alpha
我們現(xiàn)在看效果是錯誤的,又回到

我們需要給alpha做一個剔除

完成

因為我們是加到場景需要增加 一個是場景霧效,一個是漫反射顏色。
全代碼
總結(jié)
主要難點在空間空間轉(zhuǎn)換階段,容易出現(xiàn)錯誤,

第二部分,采樣UV不是 xy ? 是xz

第三部分,計算遮罩

資料參考
URP下屏幕空間貼花(ScreenSpaceDecal)學習筆記 | 煙雨迷離半世殤的成長之路 (lfzxb.top)