-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdither.gdshader
97 lines (92 loc) · 2.76 KB
/
dither.gdshader
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
shader_type canvas_item;
const mat4 bayertl = mat4(
vec4(0.0/64.0, 32.0/64.0, 8.0/64.0, 40.0/64.0) ,
vec4(48.0/64.0, 16.0/64.0, 56.0/64.0, 24.0/64.0),
vec4(12.0/64.0, 44.0/64.0, 4.0/64.0, 36.0/64.0),
vec4(60.0/64.0, 28.0/64.0, 52.0/64.0, 20.0/64.0)
);
const mat4 bayertr = mat4(
vec4( 2.0/64.0, 34.0/64.0, 10.0/64.0, 42.0/64.0),
vec4(50.0/64.0, 18.0/64.0, 58.0/64.0, 26.0/64.0),
vec4(14.0/64.0, 46.0/64.0, 6.0/64.0, 38.0/64.0),
vec4(62.0/64.0, 30.0/64.0, 54.0/64.0, 22.0/64.0)
);
const mat4 bayerbl = mat4(
vec4(3.0/64.0, 35.0/64.0, 11.0/64.0, 43.0/64.0),
vec4(51.0/64.0, 19.0/64.0, 59.0/64.0, 27.0/64.0),
vec4(15.0/64.0, 47.0/64.0, 7.0/64.0, 39.0/64.0),
vec4(63.0/64.0, 31.0/64.0, 55.0/64.0, 23.0/64.0)
);
const mat4 bayerbr = mat4(
vec4(1.0/64.0, 33.0/64.0, 9.0/64.0, 41.0/64.0),
vec4(49.0/64.0, 17.0/64.0, 57.0/64.0, 25.0/64.0),
vec4(13.0/64.0, 45.0/64.0, 5.0/64.0, 37.0/64.0),
vec4(61.0/64.0, 29.0/64.0, 53.0/64.0, 21.0/64.0)
);
uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, repeat_disable, filter_nearest;
float dither( mat4 m, ivec2 p )
{
if( p.y == 0 )
{
if( p.x == 0 ) return m[0][0];
else if( p.x == 1 ) return m[1][0];
else if( p.x == 2 ) return m[2][0];
else return m[3][0];
}
else if( p.y == 1 )
{
if( p.x == 0 ) return m[0][1];
else if( p.x == 1 ) return m[1][1];
else if( p.x == 2 ) return m[2][1];
else return m[3][1];
}
else if( p.y == 2 )
{
if( p.x == 0 ) return m[0][1];
else if( p.x == 1 ) return m[1][2];
else if( p.x == 2 ) return m[2][2];
else return m[3][2];
}
else
{
if( p.x == 0 ) return m[0][3];
else if( p.x == 1 ) return m[1][3];
else if( p.x == 2 ) return m[2][3];
else return m[3][3];
}
}
void fragment( ) {
vec2 iResolution = 1.0 / SCREEN_PIXEL_SIZE;
ivec2 p = ivec2(mod( FRAGCOORD.xy, 8.0 ));
vec2 uv = FRAGCOORD.xy / iResolution.xy;
vec3 c = texture( SCREEN_TEXTURE, uv ).xyz;
c = pow( c, vec3(2.2) );
c -= 1.0/255.0;
vec3 d = vec3(0.0);
if( p.x <= 3 && p.y <= 3 )
{
d.r = float( c.r > dither( bayertl, p ) );
d.g = float( c.g > dither( bayertl, p ) );
d.b = float( c.b > dither( bayertl, p ) );
}
else if ( p.x > 3 && p.y <= 3 )
{
d.r = float( c.r > dither( bayertr, p -ivec2(4,0) ) );
d.g = float( c.g > dither( bayertr, p -ivec2(4,0) ) );
d.b = float( c.b > dither( bayertr, p -ivec2(4,0) ) );
}
else if( p.x <= 3 && p.y > 3 )
{
d.r = float( c.r > dither( bayerbl, p-ivec2(0,4) ) );
d.g = float( c.g > dither( bayerbl, p-ivec2(0,4) ) );
d.b = float( c.b > dither( bayerbl, p-ivec2(0,4) ) );
}
else if ( p.x > 3 && p.y > 3 )
{
d.r = float( c.r > dither( bayerbr, p -ivec2(4,4) ) );
d.g = float( c.g > dither( bayerbr, p -ivec2(4,4) ) );
d.b = float( c.b > dither( bayerbr, p -ivec2(4,4) ) );
}
//c=texture( iChannel0, uv ).xyz;
COLOR = vec4(d, 1.0);
}