如上圖所示,使用卷積核,計算螢幕影象每個點的畫素和當前點周圍的畫素,進行卷積操作,可以得到梯度值。主要演算法如下:
for
(int it=
0;it<
9; it++);
half edge =1-
abs(edgex)
-abs
(edgey)
;//計算最後的梯度值
如果當前畫素左右色差大,說明處於邊緣的位置,根據上面演算法得到的梯度值也會較大。再根據梯度值,對邊緣色與原色進行插值,得到最終顏色值即可。
fixed4 withedgecolor =
lerp
( _edgecolor,
tex2d
( _maintex, i.uv[4]
), edge )
;//計算背景為原圖的顏色值
shader "custom/edgedetectiontest"
_edgeonly
("_edgeonly"
,float)
=1.0
_edgecolor
("_edgecolor"
, color)=(
0,0,
0,1)
_backcolor
("_backcolor"
,color)=(
1,1,
1,1)
} subshader
;//計算亮度值
fixed luminance (fixed4 color)
;//計算當前畫素的梯度值,做卷積操作
half sobel
(v2f i)
;const half gy[9]
=;half texcolor;
half edgex =0;
half edgey =0;
for(
int it=
0;it<
9; it++);
half edge =1-
abs(edgex)
-abs
(edgey)
;//計算最後的梯度值
return edge;};
v2f vert
;
fixed4 fragsobel
(v2f i)
: sv_target
; endcg
}}fallback off
}
螢幕後處理
void onrenderimage rendertexture src,rendertexture dest 螢幕後處理函式 graphics.blit src,dest,mat,pass 螢幕後處理 src當前螢幕紋理 graphics.drawmesh amesh,vector3.zero,q...
Unity Shader 螢幕後效果 邊緣檢測
關於螢幕後效果的控制類詳細見之前寫的另一篇部落格 這篇主要是基於之前的控制類,實現另一種常見的螢幕後效果 邊緣檢測。概念和原理部分 首先,我們需要知道在圖形學中經常處理畫素的一種操作 卷積。卷積操作的實質在於,對於影象中的每個畫素與其周圍的畫素進行的重新融合計算行為,以得到不同的畫素處理效果,例如銳...
螢幕後處理 運動模糊(通過畫素速度)
在相機上掛指令碼,獲得引數 模糊程度 前乙個視角投影矩陣 當前視角投影矩陣的逆矩陣,傳遞給到shader中 shader中,先對深度紋理取樣,得到深度值。再通過之前傳遞的矩陣,得到世界空間中,當前幀改點所在位置與前一幀改點所在位置。再根據這兩個點,求得速度值 也就是上一步求得的兩個點的中心點 使用傳...