[Bf-blender-cvs] [7aab508e327] master: Color Management: support different settings for render and compositing output

Brecht Van Lommel noreply at git.blender.org
Wed Mar 23 15:22:11 CET 2022


Commit: 7aab508e3273ae1762ae815bbecc8842938f0926
Author: Brecht Van Lommel
Date:   Wed Mar 9 15:38:17 2022 +0100
Branches: master
https://developer.blender.org/rB7aab508e3273ae1762ae815bbecc8842938f0926

Color Management: support different settings for render and compositing output

The Output Properties > Output panel now has a Color Management subpanel to
override scene settings. When set to Override instead of Follow Scene, there
are settings to:

* For OpenEXR, choose a (linear) colorspace for RGBA passes
* For other file formats, use different display/view/look/exposure/gamma

These settings affect animation render output, image save of renders and the
compositor file output node. Additionally, the image save operator and
compositor file output nodes also support overriding color management.

Includes some layout changes to the relevant panels to accomdate the new
settings and to improve consistency. Ideally subpanels would be used to better
organize these settings, however nodes and operators don't currently support
creating subpanels.

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

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

M	release/scripts/startup/bl_ui/properties_output.py
M	source/blender/blenkernel/BKE_image_save.h
M	source/blender/blenkernel/intern/image_format.cc
M	source/blender/blenkernel/intern/image_save.cc
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/space_image/image_buttons.c
M	source/blender/editors/space_image/image_ops.c
M	source/blender/imbuf/IMB_colormanagement.h
M	source/blender/imbuf/intern/colormanagement.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_color.c
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/nodes/composite/nodes/node_composite_output_file.cc
M	source/blender/render/intern/render_result.c

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

diff --git a/release/scripts/startup/bl_ui/properties_output.py b/release/scripts/startup/bl_ui/properties_output.py
index 34e86184097..312a580bf7d 100644
--- a/release/scripts/startup/bl_ui/properties_output.py
+++ b/release/scripts/startup/bl_ui/properties_output.py
@@ -296,6 +296,41 @@ class RENDER_PT_output_views(RenderOutputButtonsPanel, Panel):
         layout.template_image_views(rd.image_settings)
 
 
+class RENDER_PT_output_color_management(RenderOutputButtonsPanel, Panel):
+    bl_label = "Color Management"
+    bl_options = {'DEFAULT_CLOSED'}
+    bl_parent_id = "RENDER_PT_output"
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
+
+    def draw(self, context):
+        scene = context.scene
+        image_settings = scene.render.image_settings
+
+        layout = self.layout
+        layout.use_property_split = True
+        layout.use_property_decorate = False  # No animation.
+
+        layout.row().prop(image_settings, "color_management", text=" ", expand=True)
+
+        flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
+
+        if image_settings.color_management == 'OVERRIDE':
+            owner = image_settings
+        else:
+            owner = scene
+            flow.enabled = False
+
+        col = flow.column()
+
+        if image_settings.has_linear_colorspace:
+            if hasattr(owner, 'linear_colorspace_settings'):
+                col.prop(owner.linear_colorspace_settings, "name", text="Color Space")
+        else:
+            col.prop(owner.display_settings, "display_device")
+            col.separator()
+            col.template_colormanaged_view_settings(owner, "view_settings")
+
+
 class RENDER_PT_encoding(RenderOutputButtonsPanel, Panel):
     bl_label = "Encoding"
     bl_parent_id = "RENDER_PT_output"
@@ -484,6 +519,7 @@ classes = (
     RENDER_PT_stereoscopy,
     RENDER_PT_output,
     RENDER_PT_output_views,
+    RENDER_PT_output_color_management,
     RENDER_PT_encoding,
     RENDER_PT_encoding_video,
     RENDER_PT_encoding_audio,
diff --git a/source/blender/blenkernel/BKE_image_save.h b/source/blender/blenkernel/BKE_image_save.h
index f9d07387463..b022e677845 100644
--- a/source/blender/blenkernel/BKE_image_save.h
+++ b/source/blender/blenkernel/BKE_image_save.h
@@ -47,7 +47,7 @@ bool BKE_image_save(struct ReportList *reports,
                     struct ImageUser *iuser,
                     struct ImageSaveOptions *opts);
 
-/* Lower level image writing. */
+/* Render saving. */
 
 /* Save single or multilayer OpenEXR files from the render result.
  * Optionally saves only a specific view or layer. */
@@ -55,6 +55,7 @@ bool BKE_image_render_write_exr(struct ReportList *reports,
                                 const struct RenderResult *rr,
                                 const char *filename,
                                 const struct ImageFormatData *imf,
+                                const bool save_as_render,
                                 const char *view,
                                 int layer);
 
diff --git a/source/blender/blenkernel/intern/image_format.cc b/source/blender/blenkernel/intern/image_format.cc
index 0783e343ec9..44aa9e21195 100644
--- a/source/blender/blenkernel/intern/image_format.cc
+++ b/source/blender/blenkernel/intern/image_format.cc
@@ -904,8 +904,27 @@ void BKE_image_format_init_for_write(ImageFormatData *imf,
 {
   *imf = (imf_src) ? *imf_src : scene_src->r.im_format;
 
-  /* Use general scene settings also used for display. */
-  BKE_color_managed_display_settings_copy(&imf->display_settings, &scene_src->display_settings);
-  BKE_color_managed_view_settings_copy(&imf->view_settings, &scene_src->view_settings);
-  BKE_color_managed_colorspace_settings_init(&imf->linear_colorspace_settings);
+  if (imf_src && imf_src->color_management == R_IMF_COLOR_MANAGEMENT_OVERRIDE) {
+    /* Use settings specific to one node, image save operation, etc. */
+    BKE_color_managed_display_settings_copy(&imf->display_settings, &imf_src->display_settings);
+    BKE_color_managed_view_settings_copy(&imf->view_settings, &imf_src->view_settings);
+    BKE_color_managed_colorspace_settings_copy(&imf->linear_colorspace_settings,
+                                               &imf_src->linear_colorspace_settings);
+  }
+  else if (scene_src->r.im_format.color_management == R_IMF_COLOR_MANAGEMENT_OVERRIDE) {
+    /* Use scene settings specific to render output. */
+    BKE_color_managed_display_settings_copy(&imf->display_settings,
+                                            &scene_src->r.im_format.display_settings);
+    BKE_color_managed_view_settings_copy(&imf->view_settings,
+                                         &scene_src->r.im_format.view_settings);
+    BKE_color_managed_colorspace_settings_copy(&imf->linear_colorspace_settings,
+                                               &scene_src->r.im_format.linear_colorspace_settings);
+  }
+  else {
+    /* Use general scene settings also used for display. */
+    BKE_color_managed_display_settings_copy(&imf->display_settings, &scene_src->display_settings);
+    BKE_color_managed_view_settings_copy(&imf->view_settings, &scene_src->view_settings);
+    STRNCPY(imf->linear_colorspace_settings.name,
+            IMB_colormanagement_role_colorspace_name_get(COLOR_ROLE_SCENE_LINEAR));
+  }
 }
diff --git a/source/blender/blenkernel/intern/image_save.cc b/source/blender/blenkernel/intern/image_save.cc
index b7f234aea59..f530183f967 100644
--- a/source/blender/blenkernel/intern/image_save.cc
+++ b/source/blender/blenkernel/intern/image_save.cc
@@ -11,6 +11,7 @@
 #include "BLI_listbase.h"
 #include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_vector.hh"
 
 #include "DNA_image_types.h"
 
@@ -31,6 +32,8 @@
 
 #include "RE_pipeline.h"
 
+using blender::Vector;
+
 void BKE_image_save_options_init(ImageSaveOptions *opts, Main *bmain, Scene *scene)
 {
   memset(opts, 0, sizeof(*opts));
@@ -220,14 +223,16 @@ static bool image_save_single(ReportList *reports,
   /* fancy multiview OpenEXR */
   if (imf->views_format == R_IMF_VIEWS_MULTIVIEW && is_exr_rr) {
     /* save render result */
-    ok = BKE_image_render_write_exr(reports, rr, opts->filepath, imf, nullptr, layer);
+    ok = BKE_image_render_write_exr(
+        reports, rr, opts->filepath, imf, save_as_render, nullptr, layer);
     image_save_post(reports, ima, ibuf, ok, opts, true, opts->filepath, r_colorspace_changed);
     BKE_image_release_ibuf(ima, ibuf, lock);
   }
   /* regular mono pipeline */
   else if (is_mono) {
     if (is_exr_rr) {
-      ok = BKE_image_render_write_exr(reports, rr, opts->filepath, imf, nullptr, layer);
+      ok = BKE_image_render_write_exr(
+          reports, rr, opts->filepath, imf, save_as_render, nullptr, layer);
     }
     else {
       colormanaged_ibuf = IMB_colormanagement_imbuf_for_write(ibuf, save_as_render, true, imf);
@@ -261,7 +266,8 @@ static bool image_save_single(ReportList *reports,
 
       if (is_exr_rr) {
         BKE_scene_multiview_view_filepath_get(&opts->scene->r, opts->filepath, view, filepath);
-        ok_view = BKE_image_render_write_exr(reports, rr, filepath, imf, view, layer);
+        ok_view = BKE_image_render_write_exr(
+            reports, rr, filepath, imf, save_as_render, view, layer);
         image_save_post(reports, ima, ibuf, ok_view, opts, true, filepath, r_colorspace_changed);
       }
       else {
@@ -307,7 +313,8 @@ static bool image_save_single(ReportList *reports,
   /* stereo (multiview) images */
   else if (opts->im_format.views_format == R_IMF_VIEWS_STEREO_3D) {
     if (imf->imtype == R_IMF_IMTYPE_MULTILAYER) {
-      ok = BKE_image_render_write_exr(reports, rr, opts->filepath, imf, nullptr, layer);
+      ok = BKE_image_render_write_exr(
+          reports, rr, opts->filepath, imf, save_as_render, nullptr, layer);
       image_save_post(reports, ima, ibuf, ok, opts, true, opts->filepath, r_colorspace_changed);
       BKE_image_release_ibuf(ima, ibuf, lock);
     }
@@ -450,10 +457,38 @@ bool BKE_image_save(
 
 /* OpenEXR saving, single and multilayer. */
 
+static float *image_exr_from_scene_linear_to_output(float *rect,
+                                                    const int width,
+                                                    const int height,
+                                                    const int channels,
+                                                    const ImageFormatData *imf,
+                                                    Vector<float *> &tmp_output_rects)
+{
+  if (imf == nullptr) {
+    return rect;
+  }
+
+  const char *to_colorspace = imf->linear_colorspace_settings.name;
+  if (to_colorspace[0] == '\0' || IMB_colormanagement_space_name_is_scene_linear(to_colorspace)) {
+    return rect;
+  }
+
+  float *output_rect = (float *)MEM_dupallocN(rect);
+  tmp_output_rects.append(output_rect);
+
+  const char *from_colorspace = IMB_colormanagement_role_colorspace_name_get(
+      COLOR_ROLE_SCENE_LINEAR);
+  IMB_colormanagement_transform(
+      output_rect, width, height, channels, from_colorspace, to_colorspace, false);
+
+  return output_rect;
+}
+
 bool BKE_image_render_write_exr(ReportList *reports,
                                 const RenderResult *rr,
-                                const char *filename,
+                                const char *filepath,
                                 const ImageFormatData *imf,
+                                const bool save_as_render,
                                 const char *view,
                                 int layer)
 {
@@ -461,6 +496,7 @@ bool BKE_image_render_write_exr(ReportList *reports,
   const bool half_float = (imf && imf->depth == R_IMF_CHAN_DEPTH_16);
   const bool multi_layer = !(imf && imf->imtype == R_IMF_IMTYPE_OPENEXR);
   const bool write_z = !multi_layer && (imf && (imf->flag & R_IMF_FLAG_ZBUF));
+  Vector<float *> tmp_output_rects;
 
   /* Write first layer if not multilayer and no layer was specified. */
   if (!multi_layer && layer == -1) {
@@ -498,7 +534,10 @@ bool BKE_image_render_write_exr(ReportList *reports,
         continue;
       }
 
-      float *output_rect = rview->rectf;
+ 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list