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
This commit is contained in:
Brecht Van Lommel 2018-07-30 15:44:25 +02:00
parent 2e2e7aff7c
commit c86b5fa820
Notes: blender-bot 2023-06-21 19:23:24 +02:00
Referenced by issue #57649, View Transform and Look settings are ignored in LookDev mode
8 changed files with 35 additions and 20 deletions

View File

@ -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>

View File

@ -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;

View File

@ -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 */

View File

@ -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) {

View File

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

View File

@ -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 {

View File

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

View File

@ -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) {