//SHADER ORIGINALY CREADED BY "paniq" FROM SHADERTOY //MODIFIED AND PORTED TO GODOT BY AHOPNESS (@ahopness) //LICENSE : CC0 //COMATIBLE WITH : GLES2, GLES3, WEBGL //SHADERTOY LINK : https://www.shadertoy.com/view/MdcGzj shader_type canvas_item; uniform float color_depth :hint_range(0.0, 255.0) = 100.0; uniform float color_number :hint_range(0.0, 50.0) = 20.0; const mat3 rgb2ycbcr = mat3( vec3(0.299, -0.168736, 0.5), vec3(0.587, -0.331264, -0.418688), vec3(0.114, 0.5, -0.081312) ); const mat3 ycbcr2rgb = mat3( vec3(1.0, 1.0, 1.0), vec3(0.0, -0.344136, 1.772), vec3(1.402, -0.714136, 0.0) ); // simulating 8:4:4 compression ratio (16bit) vec3 compress_ycbcr_844 (vec3 rgb) { vec3 ycbcr = rgb2ycbcr * rgb; ycbcr.r = floor(ycbcr.r * color_depth + 0.5) / color_depth; ycbcr.gb += 0.5; ycbcr.gb = floor(ycbcr.gb * color_number + 0.5) / color_number; ycbcr.gb -= 0.5; return ycbcr2rgb * ycbcr; } void fragment(){ vec2 uv = FRAGCOORD.xy / (1.0 / SCREEN_PIXEL_SIZE).xy; vec3 rgb = texture(SCREEN_TEXTURE, uv).rgb; rgb = compress_ycbcr_844(rgb); COLOR = vec4(rgb,1.0); }