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
|
#version 330
float maxoff = 10;
float minoff = 0;
float hue = 0.3;
float block_max = 500;
float block_min = 200;
float pixelate_size = 3;
in vec2 texcoord; // texture coordinate of the fragment
uniform sampler2D tex; // texture of the window
vec4 default_post_processing(vec4 c);
uniform float time; // Time in miliseconds.
float max_opacity = 0.9;
float opacity_threshold(float opacity)
{
// if statement jic?
if (opacity >= max_opacity) {
return 1.0;
} else {
return min(1, opacity/max_opacity);
}
}
// Pseudo-random function (from original shader)
float random(float n) {
return fract(sin(n) * 43758.5453f);
}
float rand_offset(float b, float off) {
return (random(b*64) - 0.5) * (off*2);
}
vec4 alpha_effect(vec4 pix, vec2 coord) {
if (random(coord.x * random(coord.y / 100)) < pix.w) {
pix.w = 1;
return pix;
}
return vec4(0, 0, 0, 0);
}
vec3 hueShift( vec3 color, float hueAdjust ){
const vec3 kRGBToYPrime = vec3 (0.299, 0.587, 0.114);
const vec3 kRGBToI = vec3 (0.596, -0.275, -0.321);
const vec3 kRGBToQ = vec3 (0.212, -0.523, 0.311);
const vec3 kYIQToR = vec3 (1.0, 0.956, 0.621);
const vec3 kYIQToG = vec3 (1.0, -0.272, -0.647);
const vec3 kYIQToB = vec3 (1.0, -1.107, 1.704);
float YPrime = dot (color, kRGBToYPrime);
float I = dot (color, kRGBToI);
float Q = dot (color, kRGBToQ);
float hue = atan (Q, I);
float chroma = sqrt (I * I + Q * Q);
hue += hueAdjust;
Q = chroma * sin (hue);
I = chroma * cos (hue);
vec3 yIQ = vec3 (YPrime, I, Q);
return vec3( dot (yIQ, kYIQToR), dot (yIQ, kYIQToG), dot (yIQ, kYIQToB) );
}
vec4 anim(float alpha) {
float block = mix(block_max, block_min, alpha);
vec2 bs = floor(texcoord / block) * block + block/2;
float b = random(bs.y) * random(mod(time/10000,2));
float off = mix(maxoff, minoff, alpha);
if (b > alpha) {
off = 0;
}
// Offsets in pixels for each color
vec2 uvr = vec2(rand_offset(b*1, off), rand_offset(b*6, off));
vec2 uvg = vec2(rand_offset(b*2, off), rand_offset(b*7, off));
vec2 uvb = vec2(rand_offset(b*3, off), rand_offset(b*8, off));
// Calculate offset coords
uvr += texcoord;
uvg += texcoord;
uvb += texcoord;
// Fetch colors using offset coords
vec3 offset_color;
offset_color.x = texelFetch(tex, ivec2(uvr), 0).x;
offset_color.y = texelFetch(tex, ivec2(uvg), 0).y;
offset_color.x = hueShift(texelFetch(tex, ivec2(uvr), 0).xyz, hue).x;
offset_color.y = hueShift(texelFetch(tex, ivec2(uvg), 0).xyz, hue).y;
offset_color.z = hueShift(texelFetch(tex, ivec2(uvb), 0).xyz, hue).z;
offset_color.xyz = hueShift(offset_color.xyz, -hue);
// Set the new color
vec4 c;
c.xyz = offset_color;
return c;
}
vec4 window_shader() {
vec4 c = texelFetch(tex, ivec2(texcoord), 0);
c = default_post_processing(c);
float opacity = opacity_threshold(c.w);
c = anim(opacity);
c.w = opacity;
c = alpha_effect(c, ceil(texcoord / pixelate_size) * pixelate_size);
//c = default_post_processing(c);
return c;
}
|