URP | 后處理-描邊
內(nèi)容偏多

使用軟件 Unity 2021.3.15 后處理實現(xiàn)描邊效果
目的
后處理實現(xiàn)描邊效果
這樣做有什么需要注意的地方
效果

深度描邊
Renderer Feature
我們準備一個默認的 Renderer Feature 在只需要把Shader渲染出來就可以
管線準備
URP | 后處理-自定義后處理 - 嗶哩嗶哩 (bilibili.com)

Shader
上面定好后處理管線了,那我們開始制作Shader, 核心算法是在Shader中。
提供默認Shader模板
為了計算輪廓,計算相鄰像素進行采樣比較兩個像素的值,如果數(shù)值不同,就判斷是邊緣繪制一條線。
使用深度計算我們的邊緣,在深度緩存中以X形狀進行采樣,
定義我們的渲染儲存大小 _MainTex_TexelSize,_Scale
我們首先計算兩個值,然后.這兩個值將隨著增加而遞增 1。通過以這種方式縮放UV,我們能夠一次僅增加一個像素的邊緣寬度 - 實現(xiàn)最大可能的粒度 - 同時仍然保持坐標的中心。

擴展_MainTex_TexelSize和_MainTex_ST 的區(qū)別?
_MainTex_TexelSize 是貼圖 _MainTex 的像素尺寸大小,值: Vector4(1 / width, 1 / height, width, height)
half2 offs = _MainTex_TexelSize.xy * half2(1,0) * ?_BlurSize;
_MainTex_ST 是貼圖_MainTex的tiling和offset的四元數(shù)
_MainTex_ST.xy 是tiling的值
_MainTex_ST.zw 是offset的值
// Transforms 2D UV by scale/bias property #define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)
注意:這里前到 后處理和管線中增加 控制 Scale 屬性
后處理

管線中增加控制Shader

這樣后續(xù)才能顯示正確

采樣深度
URP | Depth 深度 - 嗶哩嗶哩 (bilibili.com)
使用我們計算出來的UV對深度進行采樣。
增加深度

因為我們是4個方向,所以使用4個方向采樣深度。
我們輸出一個深度查看一下效果,

效果

使用減法來比較像素之間的不同深度。

由于差值可以是正數(shù)或負數(shù),因此我們在返回結(jié)果之前取其絕對值。由于附近深度值之間的差異可能非常?。ㄒ虼撕茈y在屏幕上看到),我們將差異乘以 100 以使其更容易看到。
效果

這個是檢測邊緣的一半,depthFiniteDifference1 是另一半。
我們現(xiàn)在需要把這倆個合并成一個,
效果

我們看到表面還是有很多灰色區(qū)域,我們希望是只有黑和白。

增加一個變量控制,黑白

到后處理中增加控制變量的方法,

并且增加到 Render里

效果

出現(xiàn)大面積的白色區(qū)域,這些區(qū)域不是我想要的,我們對表面深度進行調(diào)整。

效果

使用深度法線
我們要獲取深度法線,我們在管線中增加一個SSAO ,SSAO自帶深度法線
SSAO

使用深度法線來繪制,不是深度,我們最后把兩者結(jié)合起來,
Shader中增加法線深度

使用同樣的方法調(diào)用
我們前輸出看一下深度法線是否起作用,

效果

顯示這樣的效果就是正確的,如果是黑色的還是沒有獲取到深度法線。
現(xiàn)在輸出 edgeNormal 法線計算的邊緣

我們可以看到法線產(chǎn)生了一些新的邊緣,原來的邊緣效果有一些消失了,
我們把這倆種方法結(jié)合起來。

效果

我們看到平面有時候一片白色的區(qū)域
可以調(diào)大 深度處理來處理,但是會出現(xiàn)法線邊緣不完整的情況。


為什么出現(xiàn)白色邊緣?
白色區(qū)域
表面的斜率越大,相鄰像素深度之間的差異就越大。沿著這些表面的這種大深度增量導致我們的算法檢測它們上的“邊緣”
為了實現(xiàn)這一點,我們需要每個表面的法線,以及從相機到表面的視角方向。
我們計算視角方向,
我們使用發(fā)法線深度是在屏幕空間中,所以我們攝像機視角方向也需要在屏幕空間才可以計算,
我們需要視角空間轉(zhuǎn)換到屏幕空間,我們需要反向投影矩陣。
后處理腳本中我們計算視角方向

Shader中獲取后處理傳入的View
我們Shader計算屏幕空間中的視角方向。
片元著色器階段來處理計算法線和視角關(guān)系
我們在合并輸出,一個是邊緣的顏色,一個原圖顏色。
注意:記得在Volume增加顏色控制。
效果


Volume
后處理組件,我們在后處理組件中定義我們剛剛Shader中創(chuàng)建的變量屬性,
效果

代碼
Shader
Render
Volume
總結(jié)
實現(xiàn)后處理描邊,比較復雜的地方是在Shader階段,需要的數(shù)據(jù)很對,主要是獲取深度和深度法線的計算方式,
深度獲取記得開始管線

深度法線,我們使用SSAO系統(tǒng)給我們提供好的,

計算視角,需要把視角方向轉(zhuǎn)換到屏幕空間進行計算,那一部分比較復雜,主要是 一個是處理UV,一個是處理使用頂點轉(zhuǎn)換到屏幕空間。
資料
卡通渲染之描邊技術(shù)的實現(xiàn)(URP) - 知乎 (zhihu.com)
URP/LWRP Shader實現(xiàn)描邊效果_danad的博客-CSDN博客_urp 描邊
Unity Outline Shader Tutorial - Roystan