165 lines
		
	
	
		
			No EOL
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			No EOL
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
shader_type canvas_item;
 | 
						|
 | 
						|
// Color space code from
 | 
						|
// HSV: https://godotshaders.com/shader/hsv-adjustment/
 | 
						|
// LAB/XYZ: https://gist.github.com/msbarry/cd98f928542f5152111a
 | 
						|
// Note: don't use the XYZ space, but sources use it to convert to LAB
 | 
						|
 | 
						|
 | 
						|
 | 
						|
uniform sampler2D screen_texture : hint_screen_texture;
 | 
						|
 | 
						|
 | 
						|
uniform float param : hint_range(0.0, 255.0, 1.0);
 | 
						|
uniform float param2 : hint_range(0.0, 255.0, 1.0);
 | 
						|
 | 
						|
vec3 rgb2hsv(vec3 c) {
 | 
						|
    vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
 | 
						|
    vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
 | 
						|
    vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
 | 
						|
 | 
						|
    float d = q.x - min(q.w, q.y);
 | 
						|
    float e = 1.0e-10;
 | 
						|
    return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
 | 
						|
}
 | 
						|
 | 
						|
vec3 hsv2rgb(vec3 c) {
 | 
						|
    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
 | 
						|
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
 | 
						|
    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
 | 
						|
}
 | 
						|
 | 
						|
vec3 rgb2xyz(vec3 c) {
 | 
						|
  float R = ((c.r > 0.04045) ? pow((( c.r + 0.055 ) / 1.055), 2.4) : (c.r / 12.92)) * 100.0;
 | 
						|
  float G = ((c.g > 0.04045) ? pow((( c.g + 0.055 ) / 1.055), 2.4) : (c.g / 12.92)) * 100.0;
 | 
						|
  float B = ((c.b > 0.04045) ? pow((( c.b + 0.055 ) / 1.055), 2.4) : (c.b / 12.92)) * 100.0;
 | 
						|
 | 
						|
  float X = R * 0.4124 + G * 0.3576 + B * 0.1805;
 | 
						|
  float Y = R * 0.2126 + G * 0.7152 + B * 0.0722;
 | 
						|
  float Z = R * 0.0193 + G * 0.1192 + B * 0.9505;
 | 
						|
 | 
						|
  return vec3(X, Y, Z);
 | 
						|
}
 | 
						|
 | 
						|
vec3 xyz2rgb(vec3 c) {
 | 
						|
  float X = c.x / 100.0;
 | 
						|
  float Y = c.y / 100.0;
 | 
						|
  float Z = c.z / 100.0;
 | 
						|
 | 
						|
  float R = X *  3.2406 + Y * -1.5372 + Z * -0.4986;
 | 
						|
  float G = X * -0.9689 + Y *  1.8758 + Z *  0.0415;
 | 
						|
  float B = X *  0.0557 + Y * -0.2040 + Z *  1.0570;
 | 
						|
 | 
						|
  R = ((R > 0.0031308) ? (1.055 * ( pow( R, 1./2.4 ) ) - 0.055) : (12.92 * R)); 
 | 
						|
  G = ((G > 0.0031308) ? (1.055 * ( pow( G, 1./2.4 ) ) - 0.055) : (12.92 * G)); 
 | 
						|
  B = ((B > 0.0031308) ? (1.055 * ( pow( B, 1./2.4 ) ) - 0.055) : (12.92 * B)); 
 | 
						|
 | 
						|
  return vec3(R, G, B);
 | 
						|
}
 | 
						|
 | 
						|
vec3 xyz2lab(vec3 c) {
 | 
						|
  float X = c.x / 95.047;
 | 
						|
  float Y = c.y / 100.0;
 | 
						|
  float Z = c.z / 108.883;
 | 
						|
 | 
						|
  X = ((X > 0.008856) ? (pow( X, 1./3.)) : (( 7.787 * X ) + ( 16./116.)));
 | 
						|
  Y = ((Y > 0.008856) ? (pow( Y, 1./3.)) : (( 7.787 * Y ) + ( 16./116.)));
 | 
						|
  Z = ((Z > 0.008856) ? (pow( Z, 1./3.)) : (( 7.787 * Z ) + ( 16./116.)));
 | 
						|
 | 
						|
  float L = ( 116. * Y ) - 16.;
 | 
						|
  float a = 500. * ( X - Y );
 | 
						|
  float b = 200. * ( Y - Z );
 | 
						|
 | 
						|
  return vec3(L, a, b);
 | 
						|
}
 | 
						|
 | 
						|
vec3 lab2xyz(vec3 c) {
 | 
						|
  float L = c.x;
 | 
						|
  float a = c.y;
 | 
						|
  float b = c.z;
 | 
						|
 | 
						|
  float Y = ( L + 16. ) / 116.;
 | 
						|
  float X = a / 500. + Y;
 | 
						|
  float Z = Y - b / 200.;
 | 
						|
 | 
						|
  Y = ((pow(Y,3.) > 0.008856) ? (pow(Y,3.)) : ((Y - 16. / 116.) / 7.787));
 | 
						|
  X = ((pow(X,3.) > 0.008856) ? (pow(X,3.)) : ((X - 16. / 116.) / 7.787));
 | 
						|
  Z = ((pow(Z,3.) > 0.008856) ? (pow(Z,3.)) : ((Z - 16. / 116.) / 7.787));
 | 
						|
 | 
						|
  float ref_X = 95.047;
 | 
						|
  float ref_Y = 100.0;
 | 
						|
  float ref_Z = 108.883;
 | 
						|
 | 
						|
  return vec3(ref_X * X, ref_Y * Y, ref_Z * Z);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
vec3 band_colors(vec3 rgb)
 | 
						|
{	
 | 
						|
	return round(rgb * param) / param;
 | 
						|
}
 | 
						|
 | 
						|
vec3 band_colors_preserve_hue_lum(vec3 rgb, float ncolors)
 | 
						|
{
 | 
						|
	vec3 hsv = rgb2hsv(rgb);
 | 
						|
	hsv.r = round(hsv.r * ncolors) / ncolors;
 | 
						|
	vec3 lab = xyz2lab(rgb2xyz(rgb));
 | 
						|
	lab.r = round(lab.r * (ncolors / 100.0)) / (ncolors / 100.0);
 | 
						|
	
 | 
						|
	// Into HSV
 | 
						|
	vec2 sv = rgb2hsv(xyz2rgb(lab2xyz(lab))).gb;
 | 
						|
	hsv.gb = sv;
 | 
						|
	return hsv2rgb(hsv);
 | 
						|
}
 | 
						|
 | 
						|
uniform float scale = 2.0;
 | 
						|
uniform int grid = 5;
 | 
						|
 | 
						|
vec3 band_dither(vec3 rgb, vec2 uv)
 | 
						|
{
 | 
						|
	
 | 
						|
	uv *= (1.0 / scale);
 | 
						|
	int x = int(mod(uv.x, float(grid))) + 1;
 | 
						|
	int y = int(mod(uv.y, float(grid))) + 1;
 | 
						|
	
 | 
						|
	vec3 hsv = rgb2hsv(rgb);
 | 
						|
	
 | 
						|
	int g = int(round(mix(float(grid), float(2), fract(hsv.r * param))));
 | 
						|
	
 | 
						|
	
 | 
						|
	if (x % g == 0 && y % g == 0) {
 | 
						|
		hsv.r = ceil(hsv.r * param) / param;
 | 
						|
	} else {
 | 
						|
		hsv.r = floor(hsv.r * param) / param;		
 | 
						|
	}
 | 
						|
	vec3 lab = xyz2lab(rgb2xyz(rgb));
 | 
						|
	if (x % g == 0 && y % g == 0) {
 | 
						|
		lab.r = ceil(lab.r * (param / 100.0)) / (param / 100.0);
 | 
						|
	} else {
 | 
						|
		lab.r = floor(lab.r * (param / 100.0)) / (param / 100.0);
 | 
						|
	}
 | 
						|
	
 | 
						|
	// Into HSV
 | 
						|
	vec2 sv = rgb2hsv(xyz2rgb(lab2xyz(lab))).gb;
 | 
						|
	hsv.gb = sv;
 | 
						|
	
 | 
						|
	
 | 
						|
	return hsv2rgb(hsv);
 | 
						|
	
 | 
						|
}
 | 
						|
 | 
						|
uniform float anim_period : hint_range(0.1, 5, 0.01);
 | 
						|
void fragment()
 | 
						|
{
 | 
						|
	vec3 rgb = texture(screen_texture, SCREEN_UV).rgb;
 | 
						|
	vec3 band1 = band_colors_preserve_hue_lum(rgb, param);
 | 
						|
	vec3 band2 = band_colors_preserve_hue_lum(rgb, param2);
 | 
						|
	float weight = mod(TIME, anim_period) / anim_period;
 | 
						|
	float double_weight = mod(TIME, anim_period*2.0) / (anim_period*2.0);
 | 
						|
	weight = double_weight > 0.5 ? (1.-weight) : weight;
 | 
						|
	vec3 mixed = mix(band1, band2, weight);
 | 
						|
	COLOR.rgb = mixed;
 | 
						|
	
 | 
						|
	
 | 
						|
	//COLOR.rgb = banded_nostalgia;
 | 
						|
} |