[Bf-blender-cvs] [29877fb1a44] blender2.8: Workbench: Fix srgb texture not being color managed in texture color mode

Clément Foucault noreply at git.blender.org
Mon Dec 17 17:16:51 CET 2018


Commit: 29877fb1a443e1daebf1466fa3a048ef5cefd807
Author: Clément Foucault
Date:   Fri Dec 14 19:16:35 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB29877fb1a443e1daebf1466fa3a048ef5cefd807

Workbench: Fix srgb texture not being color managed in texture color mode

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

M	source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M	source/blender/draw/engines/workbench/workbench_materials.c

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

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 76b00469f15..25942b162ee 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -141,3 +141,21 @@ vec2 matcap_uv_compute(vec3 I, vec3 N, bool flipped)
 	}
 	return matcap_uv * 0.496 + 0.5;
 }
+
+float srgb_to_linearrgb(float c)
+{
+	if (c < 0.04045)
+		return (c < 0.0) ? 0.0 : c * (1.0 / 12.92);
+	else
+		return pow((c + 0.055) * (1.0 / 1.055), 2.4);
+}
+
+vec4 srgb_to_linearrgb(vec4 col_from)
+{
+	vec4 col_to;
+	col_to.r = srgb_to_linearrgb(col_from.r);
+	col_to.g = srgb_to_linearrgb(col_from.g);
+	col_to.b = srgb_to_linearrgb(col_from.b);
+	col_to.a = col_from.a;
+	return col_to;
+}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
index d42b6bde791..aed86937e0d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
@@ -1,8 +1,8 @@
-#ifdef V3D_SHADING_TEXTURE_COLOR
-uniform sampler2D image;
+
 uniform float ImageTransparencyCutoff = 0.1;
+uniform sampler2D image;
+uniform bool imageSrgb;
 
-#endif
 uniform mat4 ProjectionMatrix;
 uniform mat4 ViewMatrixInverse;
 uniform float alpha = 0.5;
@@ -39,6 +39,9 @@ void main()
 	if (diffuse_color.a < ImageTransparencyCutoff) {
 		discard;
 	}
+	if (imageSrgb) {
+		diffuse_color = srgb_to_linearrgb(diffuse_color);
+	}
 #else
 	diffuse_color = vec4(materialDiffuseColor, 1.0);
 #endif /* V3D_SHADING_TEXTURE_COLOR */
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index 722add22a89..2ce816c6484 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -6,6 +6,7 @@ uniform float materialRoughness;
 
 uniform sampler2D image;
 uniform float ImageTransparencyCutoff = 0.1;
+uniform bool imageSrgb;
 
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
 in vec3 normal_viewport;
@@ -40,6 +41,9 @@ void main()
 	if (color.a < ImageTransparencyCutoff) {
 		discard;
 	}
+	if (imageSrgb) {
+		color = srgb_to_linearrgb(color);
+	}
 #  else
 	color.rgb = materialDiffuseColor;
 #  endif
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index c4ab39897f3..5360cf3683b 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -4,6 +4,8 @@
 
 #include "BIF_gl.h"
 
+#include "BKE_image.h"
+
 #include "BLI_dynstr.h"
 #include "BLI_hash.h"
 
@@ -189,8 +191,12 @@ void workbench_material_shgroup_uniform(
 	}
 
 	if (workbench_material_determine_color_type(wpd, material->ima, ob) == V3D_SHADING_TEXTURE_COLOR) {
+		ImBuf *ibuf = BKE_image_acquire_ibuf(material->ima, NULL, NULL);
+		const bool do_color_correction = (ibuf && (ibuf->colormanage_flag & IMB_COLORMANAGE_IS_DATA) == 0);
+		BKE_image_release_ibuf(material->ima, ibuf, NULL);
 		GPUTexture *tex = GPU_texture_from_blender(material->ima, NULL, GL_TEXTURE_2D, false, 0.0f);
 		DRW_shgroup_uniform_texture(grp, "image", tex);
+		DRW_shgroup_uniform_bool_copy(grp, "imageSrgb", do_color_correction);
 	}
 	else {
 		DRW_shgroup_uniform_vec3(grp, "materialDiffuseColor", (use_metallic) ? material->base_color : material->diffuse_color, 1);



More information about the Bf-blender-cvs mailing list