mirror of
https://git.davidovski.xyz/dot.git
synced 2026-09-14 00:35:24 +00:00
126 lines
3.2 KiB
GLSL
126 lines
3.2 KiB
GLSL
#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;
|
|
}
|
|
|