diff --git a/emigui_glium/src/painter.rs b/emigui_glium/src/painter.rs index 306000d8..15065e38 100644 --- a/emigui_glium/src/painter.rs +++ b/emigui_glium/src/painter.rs @@ -41,8 +41,18 @@ impl Painter { in vec4 v_color; in vec2 v_tc; out vec4 f_color; + + // glium expects linear output. + vec3 linear_from_srgb(vec3 srgb) { + bvec3 cutoff = lessThan(srgb, vec3(0.04045)); + vec3 higher = pow((srgb + vec3(0.055)) / vec3(1.055), vec3(2.4)); + vec3 lower = srgb / vec3(12.92); + return mix(higher, lower, cutoff); + } + void main() { f_color = v_color; + f_color.rgb = linear_from_srgb(f_color.rgb); f_color.a *= texture(u_sampler, v_tc).r; } " @@ -74,8 +84,18 @@ impl Painter { uniform sampler2D u_sampler; varying vec4 v_color; varying vec2 v_tc; + + // glium expects linear output. + vec3 linear_from_srgb(vec3 srgb) { + bvec3 cutoff = lessThan(srgb, vec3(0.04045)); + vec3 higher = pow((srgb + vec3(0.055)) / vec3(1.055), vec3(2.4)); + vec3 lower = srgb / vec3(12.92); + return mix(higher, lower, cutoff); + } + void main() { gl_FragColor = v_color; + gl_FragColor.rgb = linear_from_srgb(gl_FragColor.rgb); gl_FragColor.a *= texture2D(u_sampler, v_tc).r; } ", @@ -107,8 +127,18 @@ impl Painter { uniform sampler2D u_sampler; varying mediump vec4 v_color; varying mediump vec2 v_tc; + + // glium expects linear output. + vec3 linear_from_srgb(vec3 srgb) { + bvec3 cutoff = lessThan(srgb, vec3(0.04045)); + vec3 higher = pow((srgb + vec3(0.055)) / vec3(1.055), vec3(2.4)); + vec3 lower = srgb / vec3(12.92); + return mix(higher, lower, cutoff); + } + void main() { gl_FragColor = v_color; + gl_FragColor.rgb = linear_from_srgb(gl_FragColor.rgb); gl_FragColor.a *= texture2D(u_sampler, v_tc).r; } ",