From f0d67d8f6a01d606d6090cc6dfdb3fdc6a6e728c Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 2 May 2018 17:37:11 +0200 Subject: Workbench: Linear => srgb conversion --- .../engines/workbench/shaders/workbench_common_lib.glsl | 17 +++++++++++++++++ .../workbench/shaders/workbench_composite_frag.glsl | 8 ++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl index e9d9b8c02e8..1902a9587d2 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl @@ -33,3 +33,20 @@ vec2 normal_encode(vec3 n) float p = sqrt(n.z * 8.0 + 8.0); return vec2(n.xy / p + 0.5); } + +/* Linear to srgb conversion */ +const float SRGB_ALPHA = 0.055; +float linear_to_srgb(float channel) { + if(channel <= 0.0031308) { + return 12.92 * channel; + } else { + return (1.0 + SRGB_ALPHA) * pow(channel, 1.0/2.4) - SRGB_ALPHA; + } +} +vec3 linearrgb_to_srgb(vec3 rgb) { + return vec3( + linear_to_srgb(rgb.r), + linear_to_srgb(rgb.g), + linear_to_srgb(rgb.b) + ); +} \ No newline at end of file diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl index 0337662955e..38211239d01 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl @@ -22,7 +22,7 @@ void main() #ifndef V3D_DRAWOPTION_OBJECT_OVERLAP if (depth == 1.0) { - fragColor = vec4(background_color(world_data, uv_viewport.y), 0.0); + fragColor = vec4(linearrgb_to_srgb(background_color(world_data, uv_viewport.y)), 0.0); return; } #else /* !V3D_DRAWOPTION_OBJECT_OVERLAP */ @@ -32,9 +32,9 @@ void main() if (object_id == NO_OBJECT_ID) { vec3 background = background_color(world_data, uv_viewport.y); if (object_overlap == 0.0) { - fragColor = vec4(background, 0.0); + fragColor = vec4(linearrgb_to_srgb(background), 0.0); } else { - fragColor = vec4(mix(objectOverlapColor, background, object_overlap), 1.0-object_overlap); + fragColor = vec4(linearrgb_to_srgb(mix(objectOverlapColor, background, object_overlap)), 1.0-object_overlap); } return; } @@ -64,5 +64,5 @@ void main() shaded_color = mix(objectOverlapColor, shaded_color, object_overlap); #endif /* V3D_DRAWOPTION_OBJECT_OVERLAP */ - fragColor = vec4(shaded_color, 1.0); + fragColor = vec4(linearrgb_to_srgb(shaded_color), 1.0); } -- cgit v1.2.3