forked from bartvdbraak/blender
Color management: change view transform for color pickers and display modes.
* Use simple default view transform for color pickers, as Filmic does not work well for all types of colors. We better handle this with an option and tagging of colors as emissive or albedo like. * For solid/workbench we also no longer use Filmic, as there is not enough contrast and it's not really needed since this is not physically based lighting. * For lookdev always take into account the view transform and look. Other view settings like exposure are only taken into account if scene lighting is used, since these are often dependent on scene light intensity. Fixes T61022, T57649, T59363.
This commit is contained in:
parent
81fc55f563
commit
9a63fa21eb
@ -70,7 +70,7 @@ displays:
|
||||
- !<View> {name: Default, colorspace: Raw}
|
||||
|
||||
active_displays: [sRGB, DCIP3, Rec709, XYZ, None]
|
||||
active_views: [Filmic, Default, RRT, Raw, Log]
|
||||
active_views: [Default, Filmic, RRT, Raw, Log]
|
||||
|
||||
colorspaces:
|
||||
- !<ColorSpace>
|
||||
|
@ -94,10 +94,12 @@ void BKE_color_managed_display_settings_copy(
|
||||
const struct ColorManagedDisplaySettings *settings);
|
||||
|
||||
/* Initialize view settings to be best suitable for render type of viewing.
|
||||
* This will use default view transform from the OCIO configuration. */
|
||||
* This will use default view transform from the OCIO configuration if none
|
||||
* is specified. */
|
||||
void BKE_color_managed_view_settings_init_render(
|
||||
struct ColorManagedViewSettings *settings,
|
||||
const struct ColorManagedDisplaySettings *display_settings);
|
||||
const struct ColorManagedDisplaySettings *display_settings,
|
||||
const char *view_transform);
|
||||
|
||||
/* Initialize view settings which are best suitable for viewing non-render
|
||||
* images. For example,s movie clips while tracking. */
|
||||
|
@ -1574,23 +1574,28 @@ void BKE_color_managed_display_settings_copy(ColorManagedDisplaySettings *new_se
|
||||
|
||||
void BKE_color_managed_view_settings_init_render(
|
||||
ColorManagedViewSettings *view_settings,
|
||||
const ColorManagedDisplaySettings *display_settings)
|
||||
const ColorManagedDisplaySettings *display_settings,
|
||||
const char *view_transform)
|
||||
{
|
||||
struct ColorManagedDisplay *display =
|
||||
IMB_colormanagement_display_get_named(
|
||||
display_settings->display_device);
|
||||
BLI_strncpy(
|
||||
view_settings->view_transform,
|
||||
IMB_colormanagement_display_get_default_view_transform_name(display),
|
||||
sizeof(view_settings->view_transform));
|
||||
|
||||
if (!view_transform) {
|
||||
view_transform = IMB_colormanagement_display_get_default_view_transform_name(display);
|
||||
}
|
||||
|
||||
/* TODO(sergey): Find a way to make look query more reliable with non
|
||||
* default configuration. */
|
||||
BLI_strncpy(view_settings->look, "None", sizeof(view_settings->look));
|
||||
STRNCPY(view_settings->view_transform, view_transform);
|
||||
STRNCPY(view_settings->look, "None");
|
||||
|
||||
view_settings->flag = 0;
|
||||
view_settings->gamma = 1.0f;
|
||||
view_settings->exposure = 0.0f;
|
||||
view_settings->curve_mapping = NULL;
|
||||
|
||||
IMB_colormanagement_validate_settings(display_settings, view_settings);
|
||||
}
|
||||
|
||||
void BKE_color_managed_view_settings_init_default(
|
||||
|
@ -773,7 +773,8 @@ void BKE_scene_init(Scene *sce)
|
||||
|
||||
BKE_color_managed_display_settings_init(&sce->display_settings);
|
||||
BKE_color_managed_view_settings_init_render(&sce->view_settings,
|
||||
&sce->display_settings);
|
||||
&sce->display_settings,
|
||||
"Filmic");
|
||||
BLI_strncpy(sce->sequencer_colorspace_settings.name, colorspace_name,
|
||||
sizeof(sce->sequencer_colorspace_settings.name));
|
||||
|
||||
|
@ -301,6 +301,7 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
|
||||
if (app_template && STREQ(app_template, "Video_Editing")) {
|
||||
/* Filmic is too slow, use default until it is optimized. */
|
||||
STRNCPY(scene->view_settings.view_transform, "Default");
|
||||
STRNCPY(scene->view_settings.look, "None");
|
||||
}
|
||||
else {
|
||||
/* AV Sync break physics sim caching, disable until that is fixed. */
|
||||
|
@ -53,7 +53,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->use_color_render_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);
|
||||
stl->g_data->valid_taa_history = (txl->taa_history != NULL);
|
||||
@ -308,39 +308,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;
|
||||
bool use_render_settings = stl->g_data->use_color_render_settings;
|
||||
|
||||
GPU_framebuffer_bind(dfbl->default_fb);
|
||||
DRW_transform_to_display(stl->effects->final_tx, use_view_settings);
|
||||
DRW_transform_to_display(stl->effects->final_tx, true, use_render_settings);
|
||||
|
||||
/* Debug : Output buffer to view. */
|
||||
switch (G.debug_value) {
|
||||
case 1:
|
||||
if (txl->maxzbuffer) DRW_transform_to_display(txl->maxzbuffer, use_view_settings);
|
||||
if (txl->maxzbuffer) DRW_transform_to_display(txl->maxzbuffer, false, false);
|
||||
break;
|
||||
case 2:
|
||||
if (effects->ssr_pdf_output) DRW_transform_to_display(effects->ssr_pdf_output, use_view_settings);
|
||||
if (effects->ssr_pdf_output) DRW_transform_to_display(effects->ssr_pdf_output, false, false);
|
||||
break;
|
||||
case 3:
|
||||
if (effects->ssr_normal_input) DRW_transform_to_display(effects->ssr_normal_input, use_view_settings);
|
||||
if (effects->ssr_normal_input) DRW_transform_to_display(effects->ssr_normal_input, false, false);
|
||||
break;
|
||||
case 4:
|
||||
if (effects->ssr_specrough_input) DRW_transform_to_display(effects->ssr_specrough_input, use_view_settings);
|
||||
if (effects->ssr_specrough_input) DRW_transform_to_display(effects->ssr_specrough_input, false, false);
|
||||
break;
|
||||
case 5:
|
||||
if (txl->color_double_buffer) DRW_transform_to_display(txl->color_double_buffer, use_view_settings);
|
||||
if (txl->color_double_buffer) DRW_transform_to_display(txl->color_double_buffer, false, false);
|
||||
break;
|
||||
case 6:
|
||||
if (effects->gtao_horizons_debug) DRW_transform_to_display(effects->gtao_horizons_debug, use_view_settings);
|
||||
if (effects->gtao_horizons_debug) DRW_transform_to_display(effects->gtao_horizons_debug, false, false);
|
||||
break;
|
||||
case 7:
|
||||
if (effects->gtao_horizons) DRW_transform_to_display(effects->gtao_horizons, use_view_settings);
|
||||
if (effects->gtao_horizons) DRW_transform_to_display(effects->gtao_horizons, false, false);
|
||||
break;
|
||||
case 8:
|
||||
if (effects->sss_data) DRW_transform_to_display(effects->sss_data, use_view_settings);
|
||||
if (effects->sss_data) DRW_transform_to_display(effects->sss_data, false, false);
|
||||
break;
|
||||
case 9:
|
||||
if (effects->velocity_tx) DRW_transform_to_display(effects->velocity_tx, use_view_settings);
|
||||
if (effects->velocity_tx) DRW_transform_to_display(effects->velocity_tx, false, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -815,7 +815,7 @@ typedef struct EEVEE_PrivateData {
|
||||
float mist_start, mist_inv_dist, mist_falloff;
|
||||
|
||||
/* Color Management */
|
||||
bool use_color_view_settings;
|
||||
bool use_color_render_settings;
|
||||
} EEVEE_PrivateData; /* Transient data */
|
||||
|
||||
/* eevee_data.c */
|
||||
|
@ -42,17 +42,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;
|
||||
wpd->use_color_render_settings = true;
|
||||
}
|
||||
else if (v3d->shading.type == OB_RENDER &&
|
||||
BKE_scene_uses_blender_workbench(scene))
|
||||
{
|
||||
wpd->shading = scene->display.shading;
|
||||
wpd->use_color_view_settings = true;
|
||||
wpd->use_color_render_settings = true;
|
||||
}
|
||||
else {
|
||||
wpd->shading = v3d->shading;
|
||||
wpd->use_color_view_settings = false;
|
||||
wpd->use_color_render_settings = false;
|
||||
}
|
||||
|
||||
if (wpd->shading.light == V3D_LIGHTING_MATCAP) {
|
||||
|
@ -61,7 +61,7 @@ static void workspace_aa_draw_transform(GPUTexture *tx, WORKBENCH_PrivateData *w
|
||||
}
|
||||
else {
|
||||
/* Display space result for viewport. */
|
||||
DRW_transform_to_display(tx, wpd->use_color_view_settings);
|
||||
DRW_transform_to_display(tx, wpd->use_color_render_settings, wpd->use_color_render_settings);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -252,7 +252,7 @@ typedef struct WORKBENCH_PrivateData {
|
||||
bool dof_enabled;
|
||||
|
||||
/* Color Management */
|
||||
bool use_color_view_settings;
|
||||
bool use_color_render_settings;
|
||||
} WORKBENCH_PrivateData; /* Transient data */
|
||||
|
||||
typedef struct WORKBENCH_EffectInfo {
|
||||
|
@ -232,7 +232,7 @@ void DRW_uniformbuffer_free(struct GPUUniformBuffer *ubo);
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
void DRW_transform_to_display(struct GPUTexture *tex, bool use_view_settings);
|
||||
void DRW_transform_to_display(struct GPUTexture *tex, bool use_view_transform, bool use_render_settings);
|
||||
void DRW_transform_none(struct GPUTexture *tex);
|
||||
void DRW_multisamples_resolve(
|
||||
struct GPUTexture *src_depth, struct GPUTexture *src_color, bool use_depth);
|
||||
|
@ -256,7 +256,7 @@ struct DupliObject *DRW_object_get_dupli(const Object *UNUSED(ob))
|
||||
* \{ */
|
||||
|
||||
/* Use color management profile to draw texture to framebuffer */
|
||||
void DRW_transform_to_display(GPUTexture *tex, bool use_view_settings)
|
||||
void DRW_transform_to_display(GPUTexture *tex, bool use_view_transform, bool use_render_settings)
|
||||
{
|
||||
drw_state_set(DRW_STATE_WRITE_COLOR);
|
||||
|
||||
@ -272,19 +272,26 @@ void DRW_transform_to_display(GPUTexture *tex, bool use_view_settings)
|
||||
if (!(DST.options.is_image_render && !DST.options.is_scene_render)) {
|
||||
Scene *scene = DST.draw_ctx.scene;
|
||||
ColorManagedDisplaySettings *display_settings = &scene->display_settings;
|
||||
ColorManagedViewSettings *active_view_settings;
|
||||
ColorManagedViewSettings default_view_settings;
|
||||
if (use_view_settings) {
|
||||
active_view_settings = &scene->view_settings;
|
||||
ColorManagedViewSettings view_settings;
|
||||
if (use_render_settings) {
|
||||
/* Use full render settings, for renders with scene lighting. */
|
||||
view_settings = scene->view_settings;
|
||||
}
|
||||
else if (use_view_transform) {
|
||||
/* Use only view transform + look and nothing else for lookdev without
|
||||
* scene lighting, as exposure depends on scene light intensity. */
|
||||
BKE_color_managed_view_settings_init_render(&view_settings, display_settings, NULL);
|
||||
STRNCPY(view_settings.view_transform, scene->view_settings.view_transform);
|
||||
STRNCPY(view_settings.look, scene->view_settings.look);
|
||||
}
|
||||
else {
|
||||
BKE_color_managed_view_settings_init_render(
|
||||
&default_view_settings,
|
||||
display_settings);
|
||||
active_view_settings = &default_view_settings;
|
||||
/* For workbench use only default view transform in configuration,
|
||||
* using no scene settings. */
|
||||
BKE_color_managed_view_settings_init_render(&view_settings, display_settings, NULL);
|
||||
}
|
||||
|
||||
use_ocio = IMB_colormanagement_setup_glsl_draw_from_space(
|
||||
active_view_settings, display_settings, NULL, dither, false);
|
||||
&view_settings, display_settings, NULL, dither, false);
|
||||
}
|
||||
|
||||
if (!use_ocio) {
|
||||
|
@ -47,7 +47,7 @@ struct ColorSpace;
|
||||
|
||||
void IMB_colormanagement_check_file_config(struct Main *bmain);
|
||||
|
||||
void IMB_colormanagement_validate_settings(struct ColorManagedDisplaySettings *display_settings,
|
||||
void IMB_colormanagement_validate_settings(const struct ColorManagedDisplaySettings *display_settings,
|
||||
struct ColorManagedViewSettings *view_settings);
|
||||
|
||||
const char *IMB_colormanagement_role_colorspace_name_get(int role);
|
||||
|
@ -1168,7 +1168,7 @@ void IMB_colormanagement_check_file_config(Main *bmain)
|
||||
}
|
||||
}
|
||||
|
||||
void IMB_colormanagement_validate_settings(ColorManagedDisplaySettings *display_settings,
|
||||
void IMB_colormanagement_validate_settings(const ColorManagedDisplaySettings *display_settings,
|
||||
ColorManagedViewSettings *view_settings)
|
||||
{
|
||||
ColorManagedDisplay *display;
|
||||
|
Loading…
Reference in New Issue
Block a user