[Bf-blender-cvs] [f0d67d8f6a0] blender2.8: Workbench: Linear => srgb conversion

Jeroen Bakker noreply at git.blender.org
Wed May 2 17:38:15 CEST 2018


Commit: f0d67d8f6a01d606d6090cc6dfdb3fdc6a6e728c
Author: Jeroen Bakker
Date:   Wed May 2 17:37:11 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBf0d67d8f6a01d606d6090cc6dfdb3fdc6a6e728c

Workbench: Linear => srgb conversion

===================================================================

M	source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl

===================================================================

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);
 }



More information about the Bf-blender-cvs mailing list