[Bf-blender-cvs] [d85fd8feeb1] blender2.8: T54953: Use OCIO for display color management

Jeroen Bakker noreply at git.blender.org
Fri May 4 16:32:03 CEST 2018


Commit: d85fd8feeb1b493b891158fd4cc5ed8bd44c7990
Author: Jeroen Bakker
Date:   Fri May 4 16:26:31 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBd85fd8feeb1b493b891158fd4cc5ed8bd44c7990

T54953: Use OCIO for display color management

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

M	source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h

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

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 5fcadc21a2c..e9d9b8c02e8 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -33,20 +33,3 @@ 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)
-	);
-}
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 b032bb6a7b5..f93debc8d66 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -13,7 +13,6 @@ layout(std140) uniform world_block {
 	WorldData world_data;
 };
 
-
 void main()
 {
 	ivec2 texel = ivec2(gl_FragCoord.xy);
@@ -22,7 +21,7 @@ void main()
 
 #ifndef V3D_DRAWOPTION_OBJECT_OVERLAP
 	if (depth == 1.0) {
-		fragColor = vec4(linearrgb_to_srgb(background_color(world_data, uv_viewport.y)), 0.0);
+		fragColor = vec4(background_color(world_data, uv_viewport.y), 0.0);
 		return;
 	}
 #else /* !V3D_DRAWOPTION_OBJECT_OVERLAP */
@@ -32,9 +31,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(linearrgb_to_srgb(background), 0.0);
+			fragColor = vec4(background, 0.0);
 		} else {
-			fragColor = vec4(linearrgb_to_srgb(mix(objectOverlapColor, background, object_overlap)), 1.0-object_overlap);
+			fragColor = vec4(mix(objectOverlapColor, background, object_overlap), 1.0-object_overlap);
 		}
 		return;
 	}
@@ -64,5 +63,5 @@ void main()
 	shaded_color = mix(objectOverlapColor, shaded_color, object_overlap);
 #endif /* V3D_DRAWOPTION_OBJECT_OVERLAP */
 
-	fragColor = vec4(linearrgb_to_srgb(shaded_color), 1.0);
+	fragColor = vec4(shaded_color, 1.0);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 052ea75a7ff..a7f21223c22 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -50,6 +50,7 @@ static struct {
 	struct GPUTexture *object_id_tx; /* ref only, not alloced */
 	struct GPUTexture *color_buffer_tx; /* ref only, not alloced */
 	struct GPUTexture *normal_buffer_tx; /* ref only, not alloced */
+	struct GPUTexture *composite_buffer_tx; /* ref only, not alloced */
 
 	float light_direction[3]; /* world light direction for shadows */
 	int next_object_id;
@@ -137,7 +138,9 @@ static char *workbench_build_prepass_frag(void)
 static int get_shader_index(WORKBENCH_PrivateData *wpd)
 {
 	const int DRAWOPTIONS_MASK = V3D_DRAWOPTION_OBJECT_OVERLAP;
-	return ((wpd->drawtype_options & DRAWOPTIONS_MASK) << 2) + wpd->drawtype_lighting;
+	int index = (wpd->drawtype_options & DRAWOPTIONS_MASK);
+	index = (index << 2) + wpd->drawtype_lighting;
+	return index;
 }
 
 static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
@@ -237,6 +240,7 @@ void workbench_materials_engine_init(WORKBENCH_Data *vedata)
 		const int size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
 		e_data.object_id_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_R32UI, &draw_engine_workbench_solid);
 		e_data.color_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA8, &draw_engine_workbench_solid);
+		e_data.composite_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA16F, &draw_engine_workbench_solid);
 #ifdef WORKBENCH_ENCODE_NORMALS
 		e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RG8, &draw_engine_workbench_solid);
 #else
@@ -249,6 +253,10 @@ void workbench_materials_engine_init(WORKBENCH_Data *vedata)
 			GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx),
 			GPU_ATTACHMENT_TEXTURE(e_data.normal_buffer_tx),
 		});
+		GPU_framebuffer_ensure_config(&fbl->composite_fb, {
+			GPU_ATTACHMENT_TEXTURE(dtxl->depth),
+			GPU_ATTACHMENT_TEXTURE(e_data.composite_buffer_tx),
+		});
 	}
 
 	/* Prepass */
@@ -524,16 +532,19 @@ void workbench_materials_draw_scene(WORKBENCH_Data *vedata)
 #else
 		GPU_framebuffer_bind(dfbl->depth_only_fb);
 		DRW_draw_pass(psl->shadow_pass);
-		GPU_framebuffer_bind(dfbl->default_fb);
+		GPU_framebuffer_bind(fbl->composite_fb);
 		DRW_draw_pass(psl->composite_pass);
 		DRW_draw_pass(psl->composite_shadow_pass);
 #endif
 	}
 	else {
-		GPU_framebuffer_bind(dfbl->default_fb);
+		GPU_framebuffer_bind(fbl->composite_fb);
 		DRW_draw_pass(psl->composite_pass);
 	}
 
+	GPU_framebuffer_bind(dfbl->color_only_fb);
+	DRW_transform_to_display(e_data.composite_buffer_tx);
+
 	BLI_ghash_free(wpd->material_hash, NULL, MEM_freeN);
 	DRW_UBO_FREE_SAFE(wpd->world_ubo);
 
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index 6b8acaebc82..6f1d833a551 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -36,6 +36,7 @@
 
 typedef struct WORKBENCH_FramebufferList {
 	struct GPUFrameBuffer *prepass_fb;
+	struct GPUFrameBuffer *composite_fb;
 } WORKBENCH_FramebufferList;
 
 typedef struct WORKBENCH_StorageList {



More information about the Bf-blender-cvs mailing list