[Bf-blender-cvs] [c86b5fa820d] blender2.8: Viewport: use Filmic without scene exposure/gamma/curves for workbench.

Brecht Van Lommel noreply at git.blender.org
Mon Jul 30 18:51:24 CEST 2018


Commit: c86b5fa820d181c2beabdf4147ac17cb6ff8149b
Author: Brecht Van Lommel
Date:   Mon Jul 30 15:44:25 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBc86b5fa820d181c2beabdf4147ac17cb6ff8149b

Viewport: use Filmic without scene exposure/gamma/curves for workbench.

This ignores the scene color managment view settings for solid mode and
lookdev when not using scene lights and world. The scene settings are
intended for tweaking renders and should not affect studio lighting and
matcaps.

There may be cases where a simple sRGB transform is better than Filmic
and we could add configuration for this. Not sure if it really matters
and it may be better if we just assume matcaps and studiolights are all
created for one view transform.

Differential Revision: https://developer.blender.org/D3569

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

M	release/datafiles/colormanagement/config.ocio
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_effect_aa.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c

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

diff --git a/release/datafiles/colormanagement/config.ocio b/release/datafiles/colormanagement/config.ocio
index ce79dfeb540..c8466ab99fc 100644
--- a/release/datafiles/colormanagement/config.ocio
+++ b/release/datafiles/colormanagement/config.ocio
@@ -70,7 +70,7 @@ displays:
     - !<View> {name: Default, colorspace: Raw}
 
 active_displays: [sRGB, DCIP3, Rec709, XYZ, None]
-active_views: [Default, RRT, Raw, Log]
+active_views: [Filmic, Default, RRT, Raw, Log]
 
 colorspaces:
   - !<ColorSpace>
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index adbe165354a..8c66ba057b5 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -66,6 +66,7 @@ static void eevee_engine_init(void *ved)
 		/* Alloc transient pointers */
 		stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
 	}
+	stl->g_data->use_color_view_settings = USE_SCENE_LIGHT(v3d) || !LOOK_DEV_STUDIO_LIGHT_ENABLED(v3d);
 	stl->g_data->background_alpha = DRW_state_draw_background() ? 1.0f : 0.0f;
 	stl->g_data->valid_double_buffer = (txl->color_double_buffer != NULL);
 
@@ -316,37 +317,39 @@ static void eevee_draw_background(void *vedata)
 
 
 	/* Tonemapping and transfer result to default framebuffer. */
+	bool use_view_settings = stl->g_data->use_color_view_settings;
+
 	GPU_framebuffer_bind(dfbl->default_fb);
-	DRW_transform_to_display(stl->effects->final_tx);
+	DRW_transform_to_display(stl->effects->final_tx, use_view_settings);
 
 	/* Debug : Ouput buffer to view. */
 	switch (G.debug_value) {
 		case 1:
-			if (txl->maxzbuffer) DRW_transform_to_display(txl->maxzbuffer);
+			if (txl->maxzbuffer) DRW_transform_to_display(txl->maxzbuffer, use_view_settings);
 			break;
 		case 2:
-			if (effects->ssr_pdf_output) DRW_transform_to_display(effects->ssr_pdf_output);
+			if (effects->ssr_pdf_output) DRW_transform_to_display(effects->ssr_pdf_output, use_view_settings);
 			break;
 		case 3:
-			if (effects->ssr_normal_input) DRW_transform_to_display(effects->ssr_normal_input);
+			if (effects->ssr_normal_input) DRW_transform_to_display(effects->ssr_normal_input, use_view_settings);
 			break;
 		case 4:
-			if (effects->ssr_specrough_input) DRW_transform_to_display(effects->ssr_specrough_input);
+			if (effects->ssr_specrough_input) DRW_transform_to_display(effects->ssr_specrough_input, use_view_settings);
 			break;
 		case 5:
-			if (txl->color_double_buffer) DRW_transform_to_display(txl->color_double_buffer);
+			if (txl->color_double_buffer) DRW_transform_to_display(txl->color_double_buffer, use_view_settings);
 			break;
 		case 6:
-			if (effects->gtao_horizons_debug) DRW_transform_to_display(effects->gtao_horizons_debug);
+			if (effects->gtao_horizons_debug) DRW_transform_to_display(effects->gtao_horizons_debug, use_view_settings);
 			break;
 		case 7:
-			if (effects->gtao_horizons) DRW_transform_to_display(effects->gtao_horizons);
+			if (effects->gtao_horizons) DRW_transform_to_display(effects->gtao_horizons, use_view_settings);
 			break;
 		case 8:
-			if (effects->sss_data) DRW_transform_to_display(effects->sss_data);
+			if (effects->sss_data) DRW_transform_to_display(effects->sss_data, use_view_settings);
 			break;
 		case 9:
-			if (effects->velocity_tx) DRW_transform_to_display(effects->velocity_tx);
+			if (effects->velocity_tx) DRW_transform_to_display(effects->velocity_tx, use_view_settings);
 			break;
 		default:
 			break;
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 349a27a1765..bd1323dab3b 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -774,6 +774,9 @@ typedef struct EEVEE_PrivateData {
 
 	/* Mist Settings */
 	float mist_start, mist_inv_dist, mist_falloff;
+
+	/* Color Management */
+	bool use_color_view_settings;
 } EEVEE_PrivateData; /* Transient data */
 
 /* eevee_data.c */
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 24eb0f38a46..2b716b8ffe3 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -21,14 +21,17 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
 	View3D *v3d = draw_ctx->v3d;
 	if (!v3d) {
 		wpd->shading = scene->display.shading;
+		wpd->use_color_view_settings = true;
 	}
 	else if (v3d->shading.type == OB_RENDER &&
 	         BKE_scene_uses_blender_opengl(scene))
 	{
 		wpd->shading = scene->display.shading;
+		wpd->use_color_view_settings = true;
 	}
 	else {
 		wpd->shading = v3d->shading;
+		wpd->use_color_view_settings = false;
 	}
 
 	if (wpd->shading.light == V3D_LIGHTING_MATCAP) {
diff --git a/source/blender/draw/engines/workbench/workbench_effect_aa.c b/source/blender/draw/engines/workbench/workbench_effect_aa.c
index 6269496f568..deb9a517f96 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_aa.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_aa.c
@@ -56,7 +56,7 @@ void workbench_aa_create_pass(WORKBENCH_Data *vedata, GPUTexture **tx)
 	}
 }
 
-static void workspace_aa_draw_transform(GPUTexture *tx)
+static void workspace_aa_draw_transform(GPUTexture *tx, WORKBENCH_PrivateData *wpd)
 {
 	if (DRW_state_is_image_render()) {
 		/* Linear result for render. */
@@ -64,7 +64,7 @@ static void workspace_aa_draw_transform(GPUTexture *tx)
 	}
 	else {
 		/* Display space result for viewport. */
-		DRW_transform_to_display(tx);
+		DRW_transform_to_display(tx, wpd->use_color_view_settings);
 	}
 }
 
@@ -79,7 +79,7 @@ void workbench_aa_draw_pass(WORKBENCH_Data *vedata, GPUTexture *tx)
 	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 	if (FXAA_ENABLED(wpd)) {
 		GPU_framebuffer_bind(fbl->effect_fb);
-		workspace_aa_draw_transform(tx);
+		workspace_aa_draw_transform(tx, wpd);
 		GPU_framebuffer_bind(dfbl->color_only_fb);
 		DRW_draw_pass(psl->effect_aa_pass);
 	}
@@ -92,11 +92,11 @@ void workbench_aa_draw_pass(WORKBENCH_Data *vedata, GPUTexture *tx)
 		 */
 		if (effect_info->jitter_index == 1) {
 			GPU_framebuffer_bind(dfbl->color_only_fb);
-			workspace_aa_draw_transform(tx);
+			workspace_aa_draw_transform(tx, wpd);
 		}
 		else {
 			GPU_framebuffer_bind(fbl->effect_fb);
-			workspace_aa_draw_transform(tx);
+			workspace_aa_draw_transform(tx, wpd);
 			GPU_framebuffer_bind(dfbl->color_only_fb);
 			DRW_draw_pass(psl->effect_aa_pass);
 		}
@@ -104,6 +104,6 @@ void workbench_aa_draw_pass(WORKBENCH_Data *vedata, GPUTexture *tx)
 	}
 	else {
 		GPU_framebuffer_bind(dfbl->color_only_fb);
-		workspace_aa_draw_transform(tx);
+		workspace_aa_draw_transform(tx, wpd);
 	}
 }
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index dc2894f0207..10ea0152b90 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -187,6 +187,9 @@ typedef struct WORKBENCH_PrivateData {
 	float viewvecs[3][4];
 	float ssao_params[4];
 	float ssao_settings[4];
+
+	/* Color Management */
+	bool use_color_view_settings;
 } WORKBENCH_PrivateData; /* Transient data */
 
 typedef struct WORKBENCH_EffectInfo {
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index d2c44cfef2a..0db16ab5472 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -234,7 +234,7 @@ void DRW_uniformbuffer_free(struct GPUUniformBuffer *ubo);
 	} \
 } while (0)
 
-void DRW_transform_to_display(struct GPUTexture *tex);
+void DRW_transform_to_display(struct GPUTexture *tex, bool use_view_settings);
 void DRW_transform_none(struct GPUTexture *tex);
 void DRW_multisamples_resolve(
         struct GPUTexture *src_depth, struct GPUTexture *src_color, bool use_depth);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 87239e7d93e..714edc23719 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -224,7 +224,7 @@ bool DRW_check_psys_visible_within_active_context(
  * \{ */
 
 /* Use color management profile to draw texture to framebuffer */
-void DRW_transform_to_display(GPUTexture *tex)
+void DRW_transform_to_display(GPUTexture *tex, bool use_view_settings)
 {
 	drw_state_set(DRW_STATE_WRITE_COLOR);
 
@@ -239,8 +239,11 @@ void DRW_transform_to_display(GPUTexture *tex)
 	/* View transform is already applied for offscreen, don't apply again, see: T52046 */
 	if (!(DST.options.is_image_render && !DST.options.is_scene_render)) {
 		Scene *scene = DST.draw_ctx.scene;
+		ColorManagedDisplaySettings *display_settings = &scene->display_settings;
+		ColorManagedViewSettings *view_settings = (use_view_settings) ? &scene->view_settings : NULL;
+
 		use_ocio = IMB_colormanagement_setup_glsl_draw_from_space(
-		        &scene->view_settings, &scene->display_settings, NULL, dither, false);
+		        view_settings, display_settings, NULL, dither, false);
 	}
 
 	if (!use_ocio) {



More information about the Bf-blender-cvs mailing list