#version 330 uniform sampler2D qt_Texture0; uniform vec3 mtf_param; uniform bool bw; uniform bool invert; uniform bool srgb; uniform bool false_color; uniform vec3 whiteBalance; in vec2 qt_TexCoord0; layout(location = 0) out vec4 color; vec3 Linear2sRGB(vec3 color) { return mix(12.92 * color.rgb, 1.055 * pow(color, vec3(1.0 / 2.4)) - 0.055, greaterThan(color, vec3(0.0031308))); } vec4 MTF(vec4 x, vec3 m) { x = (x - m.x) / (m.z - m.x); x = clamp(x, vec4(0.0), vec4(1.0)); return ((m.y - 1) * x) / ((2 * m.y - 1) * x - m.y); } vec3 falsecolor(float color) { const vec3 pallete[] = vec3[]( vec3(1.0, 0.0, 1.0), //magneta vec3(0.0, 0.0, 1.0), //blue vec3(0.0, 1.0, 1.0), //cyan vec3(0.0, 1.0, 0.0), //green vec3(1.0, 1.0, 0.0), //yellow vec3(1.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0));//red color *= 5.0; int i = int(color); return mix(pallete[i], pallete[i+1], fract(color)); } vec3 checker() { vec2 pattern = fract(gl_FragCoord.xy * 0.0625) - 0.5; return vec3(step(pattern.x * pattern.y, 0.0) * 0.25 + 0.25); } void main(void) { color = texture(qt_Texture0, qt_TexCoord0); if(bw)color = color.rrra; color = MTF(color, mtf_param); if(false_color)color.rgb = falsecolor(color.r); if(invert)color.rgb = vec3(1.0) - color.rgb; color.rgb = mix(checker(), color.rgb, color.a); if(srgb)color.rgb = Linear2sRGB(color.rgb); color.rgb *= whiteBalance; if(any(lessThan(qt_TexCoord0, vec2(0.0))) || any(greaterThan(qt_TexCoord0, vec2(1.0)))) color = vec4(0.0, 0.0, 0.0, 1.0); color.a = 1.0; }