-
Notifications
You must be signed in to change notification settings - Fork 2
/
Sobel Filter.shader
129 lines (105 loc) · 4.33 KB
/
Sobel Filter.shader
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
Shader "Custom/Sobel Filter"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DeltaX("Delta X", Float) = 0.01
_DeltaY("Delta Y", Float) = 0.01
_SobelScale("Sobel Multiplier", Float) = 1
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float depth : TEXCOORD1;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
COMPUTE_EYEDEPTH(o.depth);
return o;
}
sampler2D _MainTex;
float _DeltaX;
float _DeltaY;
float _SobelScale;
float sobel(sampler2D tex, float2 uv) {
float2 delta = float2(_DeltaX, _DeltaY);
float4 hr = float4(0, 0, 0, 0);
float4 vt = float4(0, 0, 0, 0);
hr += tex2D(tex, (uv + float2(-1.0, -1.0) * delta)) * 1.0;
hr += tex2D(tex, (uv + float2(0.0, -1.0) * delta)) * 0.0;
hr += tex2D(tex, (uv + float2(1.0, -1.0) * delta)) * -1.0;
hr += tex2D(tex, (uv + float2(-1.0, 0.0) * delta)) * 2.0;
hr += tex2D(tex, (uv + float2(0.0, 0.0) * delta)) * 0.0;
hr += tex2D(tex, (uv + float2(1.0, 0.0) * delta)) * -2.0;
hr += tex2D(tex, (uv + float2(-1.0, 1.0) * delta)) * 1.0;
hr += tex2D(tex, (uv + float2(0.0, 1.0) * delta)) * 0.0;
hr += tex2D(tex, (uv + float2(1.0, 1.0) * delta)) * -1.0;
vt += tex2D(tex, (uv + float2(-1.0, -1.0) * delta)) * 1.0;
vt += tex2D(tex, (uv + float2(0.0, -1.0) * delta)) * 2.0;
vt += tex2D(tex, (uv + float2(1.0, -1.0) * delta)) * 1.0;
vt += tex2D(tex, (uv + float2(-1.0, 0.0) * delta)) * 0.0;
vt += tex2D(tex, (uv + float2(0.0, 0.0) * delta)) * 0.0;
vt += tex2D(tex, (uv + float2(1.0, 0.0) * delta)) * 0.0;
vt += tex2D(tex, (uv + float2(-1.0, 1.0) * delta)) * -1.0;
vt += tex2D(tex, (uv + float2(0.0, 1.0) * delta)) * -2.0;
vt += tex2D(tex, (uv + float2(1.0, 1.0) * delta)) * -1.0;
return sqrt(hr * hr + vt * vt);
}
float sobelDepth(sampler2D tex, float2 uv) {
float2 delta = float2((_DeltaX), (_DeltaY));
float hr = 0;// float4(0, 0, 0, 0);
float vt = 0;// float4(0, 0, 0, 0);
hr += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(-1.0, -1.0) * delta)) * 1.0;
hr += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(0.0, -1.0) * delta)) * 0.0;
hr += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(1.0, -1.0) * delta)) * -1.0;
hr += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(-1.0, 0.0) * delta)) * 2.0;
hr += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(0.0, 0.0) * delta)) * 0.0;
hr += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(1.0, 0.0) * delta)) * -2.0;
hr += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(-1.0, 1.0) * delta)) * 1.0;
hr += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(0.0, 1.0) * delta)) * 0.0;
hr += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(1.0, 1.0) * delta)) * -1.0;
vt += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(-1.0, -1.0) * delta)) * 1.0;
vt += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(0.0, -1.0) * delta)) * 2.0;
vt += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(1.0, -1.0) * delta)) * 1.0;
vt += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(-1.0, 0.0) * delta)) * 0.0;
vt += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(0.0, 0.0) * delta)) * 0.0;
vt += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(1.0, 0.0) * delta)) * 0.0;
vt += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(-1.0, 1.0) * delta)) * -1.0;
vt += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(0.0, 1.0) * delta)) * -2.0;
vt += SAMPLE_DEPTH_TEXTURE(tex, (uv + float2(1.0, 1.0) * delta)) * -1.0;
return sqrt(hr * hr + vt * vt);
}
sampler2D _CameraDepthTexture;
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv) * saturate(1.0 - (sobelDepth(_CameraDepthTexture, i.uv) * _SobelScale));// saturate(1.0 - sobel(_MainTex, i.uv));// *(i.depth * 40);
// just invert the colors
//col = 1 - col;
//float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
//depth = (sin(LinearEyeDepth(depth) / 15 + _Time.z) + 1) / 2;
//return float4(depth, depth, depth, depth);
return col;
}
ENDCG
}
}
}