[Bf-blender-cvs] [804e90b42d7] master: DRW: Color Management improvement

Clément Foucault noreply at git.blender.org
Tue Feb 11 15:24:40 CET 2020


Commit: 804e90b42d728ecb1073af8d0bae15a91b13a469
Author: Clément Foucault
Date:   Tue Feb 11 15:18:55 2020 +0100
Branches: master
https://developer.blender.org/rB804e90b42d728ecb1073af8d0bae15a91b13a469

DRW: Color Management improvement

Reviewed By: brecht sergey jbakker

Differential Revision: http://developer.blender.org/D6729

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

M	intern/opencolorio/fallback_impl.cc
M	intern/opencolorio/gpu_shader_display_transform.glsl
M	intern/opencolorio/ocio_capi.cc
M	intern/opencolorio/ocio_capi.h
M	intern/opencolorio/ocio_impl.cc
M	intern/opencolorio/ocio_impl.h
M	intern/opencolorio/ocio_impl_glsl.cc
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/DRW_engine.h
M	source/blender/draw/engines/basic/basic_engine.c
M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_renderpasses.c
M	source/blender/draw/engines/eevee/eevee_temporal_sampling.c
M	source/blender/draw/engines/external/external_engine.c
M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/gpencil/gpencil_engine.h
M	source/blender/draw/engines/overlay/overlay_antialiasing.c
M	source/blender/draw/engines/overlay/overlay_armature.c
A	source/blender/draw/engines/overlay/overlay_background.c
M	source/blender/draw/engines/overlay/overlay_edit_text.c
M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/draw/engines/overlay/overlay_image.c
M	source/blender/draw/engines/overlay/overlay_metaball.c
M	source/blender/draw/engines/overlay/overlay_motion_path.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/engines/overlay/shaders/armature_envelope_solid_frag.glsl
M	source/blender/draw/engines/overlay/shaders/armature_shape_solid_vert.glsl
M	source/blender/draw/engines/overlay/shaders/armature_sphere_solid_frag.glsl
A	source/blender/draw/engines/overlay/shaders/background_frag.glsl
A	source/blender/draw/engines/overlay/shaders/clipbound_vert.glsl
M	source/blender/draw/engines/overlay/shaders/image_frag.glsl
M	source/blender/draw/engines/select/select_engine.c
D	source/blender/draw/engines/workbench/shaders/workbench_background_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
M	source/blender/draw/engines/workbench/solid_mode.c
M	source/blender/draw/engines/workbench/transparent_mode.c
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_effect_aa.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_render.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_cache.c
A	source/blender/draw/intern/draw_color_management.c
A	source/blender/draw/intern/draw_color_management.h
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager_exec.c
M	source/blender/draw/intern/draw_view.c
M	source/blender/draw/intern/draw_view.h
M	source/blender/draw/intern/shaders/common_globals_lib.glsl
M	source/blender/editors/screen/glutil.c
M	source/blender/editors/space_image/space_image.c
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_batch.h
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/GPU_viewport.h
M	source/blender/gpu/intern/gpu_batch.c
M	source/blender/gpu/intern/gpu_framebuffer.c
M	source/blender/gpu/intern/gpu_immediate.c
M	source/blender/gpu/intern/gpu_shader.c
M	source/blender/gpu/intern/gpu_shader_private.h
M	source/blender/gpu/intern/gpu_texture.c
M	source/blender/gpu/intern/gpu_viewport.c
D	source/blender/gpu/shaders/gpu_shader_image_linear_frag.glsl
A	source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl
M	source/blender/imbuf/IMB_colormanagement.h
M	source/blender/imbuf/intern/colormanagement.c
M	source/blender/makesrna/intern/rna_render.c

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

diff --git a/intern/opencolorio/fallback_impl.cc b/intern/opencolorio/fallback_impl.cc
index ec63dccf147..8dc95d22233 100644
--- a/intern/opencolorio/fallback_impl.cc
+++ b/intern/opencolorio/fallback_impl.cc
@@ -594,6 +594,43 @@ void FallbackImpl::OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id)
   MEM_freeN(id);
 }
 
+OCIO_GroupTransformRcPtr *FallbackImpl::createGroupTransform(void)
+{
+  FallbackTransform *transform = new FallbackTransform();
+  transform->type = TRANSFORM_UNKNOWN;
+  return (OCIO_GroupTransformRcPtr *)transform;
+}
+
+void FallbackImpl::groupTransformSetDirection(OCIO_GroupTransformRcPtr * /*gt*/,
+                                              const bool /*forward */)
+{
+}
+
+void FallbackImpl::groupTransformPushBack(OCIO_GroupTransformRcPtr * /*gt*/,
+                                          OCIO_ConstTransformRcPtr * /*transform*/)
+{
+}
+
+void FallbackImpl::groupTransformRelease(OCIO_GroupTransformRcPtr * /*gt*/)
+{
+}
+
+OCIO_ColorSpaceTransformRcPtr *FallbackImpl::createColorSpaceTransform(void)
+{
+  FallbackTransform *transform = new FallbackTransform();
+  transform->type = TRANSFORM_UNKNOWN;
+  return (OCIO_ColorSpaceTransformRcPtr *)transform;
+}
+
+void FallbackImpl::colorSpaceTransformSetSrc(OCIO_ColorSpaceTransformRcPtr * /*ct*/,
+                                             const char * /*name*/)
+{
+}
+
+void FallbackImpl::colorSpaceTransformRelease(OCIO_ColorSpaceTransformRcPtr * /*ct*/)
+{
+}
+
 OCIO_ExponentTransformRcPtr *FallbackImpl::createExponentTransform(void)
 {
   FallbackTransform *transform = new FallbackTransform();
@@ -658,10 +695,12 @@ bool FallbackImpl::supportGLSLDraw(void)
 }
 
 bool FallbackImpl::setupGLSLDraw(struct OCIO_GLSLDrawState ** /*state_r*/,
-                                 OCIO_ConstProcessorRcPtr * /*processor*/,
+                                 OCIO_ConstProcessorRcPtr * /*ocio_processor_scene_to_ui*/,
+                                 OCIO_ConstProcessorRcPtr * /*ocio_processor_ui_to_display*/,
                                  OCIO_CurveMappingSettings * /*curve_mapping_settings*/,
                                  float /*dither*/,
-                                 bool /*predivide*/)
+                                 bool /*predivide*/,
+                                 bool /*overlay*/)
 {
   return false;
 }
diff --git a/intern/opencolorio/gpu_shader_display_transform.glsl b/intern/opencolorio/gpu_shader_display_transform.glsl
index 9787398e2ae..f1f77cf7df2 100644
--- a/intern/opencolorio/gpu_shader_display_transform.glsl
+++ b/intern/opencolorio/gpu_shader_display_transform.glsl
@@ -1,70 +1,68 @@
+/* Blender OpenColorIO implementation */
+
+uniform sampler1D curve_mapping_texture;
 uniform sampler2D image_texture;
+uniform sampler2D overlay_texture;
 uniform sampler3D lut3d_texture;
+uniform sampler3D lut3d_display_texture;
 
-#ifdef USE_DITHER
 uniform float dither;
-#endif
-
-in vec2 texCoord_interp;
-out vec4 fragColor;
+uniform bool predivide;
+uniform bool curve_mapping;
+uniform bool overlay;
 
-#ifdef USE_CURVE_MAPPING
-/* Curve mapping parameters
- *
- * See documentation for OCIO_CurveMappingSettings to get fields descriptions.
- * (this ones pretyt much copies stuff from C structure.)
- */
-uniform sampler1D curve_mapping_texture;
-uniform int curve_mapping_lut_size;
-uniform int use_curve_mapping_extend_extrapolate;
-uniform vec4 curve_mapping_mintable;
-uniform vec4 curve_mapping_range;
-uniform vec4 curve_mapping_ext_in_x;
-uniform vec4 curve_mapping_ext_in_y;
-uniform vec4 curve_mapping_ext_out_x;
-uniform vec4 curve_mapping_ext_out_y;
-uniform vec4 curve_mapping_first_x;
-uniform vec4 curve_mapping_first_y;
-uniform vec4 curve_mapping_last_x;
-uniform vec4 curve_mapping_last_y;
-uniform vec3 curve_mapping_black;
-uniform vec3 curve_mapping_bwmul;
+layout(std140) uniform OCIO_GLSLCurveMappingParameters
+{
+  /* Curve mapping parameters
+   *
+   * See documentation for OCIO_CurveMappingSettings to get fields descriptions.
+   * (this ones pretty much copies stuff from C structure.)
+   */
+  vec4 curve_mapping_mintable;
+  vec4 curve_mapping_range;
+  vec4 curve_mapping_ext_in_x;
+  vec4 curve_mapping_ext_in_y;
+  vec4 curve_mapping_ext_out_x;
+  vec4 curve_mapping_ext_out_y;
+  vec4 curve_mapping_first_x;
+  vec4 curve_mapping_first_y;
+  vec4 curve_mapping_last_x;
+  vec4 curve_mapping_last_y;
+  vec4 curve_mapping_black;
+  vec4 curve_mapping_bwmul;
+  int curve_mapping_lut_size;
+  int curve_mapping_use_extend_extrapolate;
+};
 
 float read_curve_mapping(int table, int index)
 {
-  /* TODO(sergey): Without -1 here image is getting darken after applying unite curve.
-   *               But is it actually correct to subtract 1 here?
-   */
-  float texture_index = float(index) / float(curve_mapping_lut_size - 1);
-  return texture(curve_mapping_texture, texture_index)[table];
+  return texelFetch(curve_mapping_texture, index, 0)[table];
 }
 
 float curvemap_calc_extend(int table, float x, vec2 first, vec2 last)
 {
   if (x <= first[0]) {
-    if (use_curve_mapping_extend_extrapolate == 0) {
+    if (curve_mapping_use_extend_extrapolate == 0) {
       /* horizontal extrapolation */
       return first[1];
     }
     else {
-      if (curve_mapping_ext_in_x[table] == 0.0)
-        return first[1] + curve_mapping_ext_in_y[table] * 10000.0;
-      else
-        return first[1] +
-               curve_mapping_ext_in_y[table] * (x - first[0]) / curve_mapping_ext_in_x[table];
+      float fac = (curve_mapping_ext_in_x[table] != 0.0) ?
+                      ((x - first[0]) / curve_mapping_ext_in_x[table]) :
+                      10000.0;
+      return first[1] + curve_mapping_ext_in_y[table] * fac;
     }
   }
   else if (x >= last[0]) {
-    if (use_curve_mapping_extend_extrapolate == 0) {
+    if (curve_mapping_use_extend_extrapolate == 0) {
       /* horizontal extrapolation */
       return last[1];
     }
     else {
-      if (curve_mapping_ext_out_x[table] == 0.0)
-        return last[1] - curve_mapping_ext_out_y[table] * 10000.0;
-      else
-        return last[1] +
-               curve_mapping_ext_out_y[table] * (x - last[0]) / curve_mapping_ext_out_x[table];
+      float fac = (curve_mapping_ext_out_x[table] != 0.0) ?
+                      ((x - last[0]) / curve_mapping_ext_out_x[table]) :
+                      -10000.0;
+      return last[1] + curve_mapping_ext_out_y[table] * fac;
     }
   }
   return 0.0;
@@ -92,80 +90,91 @@ float curvemap_evaluateF(int table, float value)
                                 vec2(curve_mapping_last_x[table], curve_mapping_last_y[table]));
   }
   else {
-    if (i < 0)
+    if (i < 0) {
       return read_curve_mapping(table, 0);
-    if (i >= CM_TABLE)
+    }
+    if (i >= CM_TABLE) {
       return read_curve_mapping(table, CM_TABLE);
-
+    }
     fi = fi - float(i);
-    return (1.0 - fi) * read_curve_mapping(table, i) + fi * read_curve_mapping(table, i + 1);
+    float cm1 = read_curve_mapping(table, i);
+    float cm2 = read_curve_mapping(table, i + 1);
+    return mix(cm1, cm2, fi);
   }
 }
 
 vec4 curvemapping_evaluate_premulRGBF(vec4 col)
 {
-  vec4 result = col;
-  result[0] = curvemap_evaluateF(0, (col[0] - curve_mapping_black[0]) * curve_mapping_bwmul[0]);
-  result[1] = curvemap_evaluateF(1, (col[1] - curve_mapping_black[1]) * curve_mapping_bwmul[1]);
-  result[2] = curvemap_evaluateF(2, (col[2] - curve_mapping_black[2]) * curve_mapping_bwmul[2]);
-  result[3] = col[3];
+  col.rgb = (col.rgb - curve_mapping_black.rgb) * curve_mapping_bwmul.rgb;
+
+  vec4 result;
+  result.r = curvemap_evaluateF(0, col.r);
+  result.g = curvemap_evaluateF(1, col.g);
+  result.b = curvemap_evaluateF(2, col.b);
+  result.a = col.a;
   return result;
 }
-#endif
 
-#ifdef USE_DITHER
 float dither_random_value(vec2 co)
 {
   return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453) * 0.005 * dither;
 }
 
-vec2 round_to_pixel(vec2 st)
+vec2 round_to_pixel(sampler2D tex, vec2 uv)
 {
-  vec2 result;
-  vec2 size = textureSize(image_texture, 0);
-  result.x = float(int(st.x * size.x)) / size.x;
-  result.y = float(int(st.y * size.y)) / size.y;
-  return result;
+  vec2 size = textureSize(tex, 0);
+  return vec2(ivec2(uv * size)) / size;
 }
 
-vec4 apply_dither(vec2 st, vec4 col)
+vec4 apply_dither(vec4 col, vec2 uv)
 {
-  vec4 result;
-  float random_value = dither_random_value(round_to_pixel(st));
-  result.r = col.r + random_value;
-  result.g = col.g + random_value;
-  result.b = col.b + random_value;
-  result.a = col.a;
-  return result;
+  col.rgb += dither_random_value(uv);
+  return col;
 }
-#endif
 
-void main()
+vec4 OCIO_ProcessColor(vec4 col, vec4 col_overlay, vec2 noise_uv)
 {
-  vec4 col = texture(image_texture, texCoord_interp.st);
-#ifdef USE_CURVE_MAPPING
-  col = curvemapping_evaluate_premulRGBF(col);
-#endif
-
-#ifdef USE_PREDIVIDE
-  if (col[3] > 0.0 && col[3] < 1.0) {
-    float inv_alpha = 1.0 / col[3];
-    col[0] *= inv_alpha;
-    col[1] *= inv_alpha;
-    col[2] *= inv_alpha;
+  if (curve_mapping) {
+    col = curvemapping_evaluate_premulRGBF(col);
+  }
+
+  if (predivide) {
+    if (col.a > 0.0 && col.a < 1.0) {
+      col.rgb *= 1.0 / col.a;
+    }
   }
-#endif
 
   /* NOTE: This is true we only do de-premul here and NO premul
    *       and the reason is simple -- opengl is always configured
    *       for straight alpha at this moment
    */
 
-  vec4 result = OCIODisplay(col, lut3d_texture);
+  col = OCIO_to_display_linear_with_look(col, lut3d_texture);
+
+  if (dither > 0.0) {
+    col = apply_dither(col, noise_uv);
+  }
+
+  if (overlay) {
+    col *= 1.0 - col_overlay.a;
+    col += col_overlay; /* Assumed unassociated alpha. */
+  }
 
-#ifdef USE_DITHER
-  result = apply_dither(texCoord_interp.st, result);
-#endif
+  col = OCIO_to_display_encoded(col, lut3d_display_texture);
 
-  fragColor = result;
+  return col;
 }
+
+/*  ------------------------------------------------------------------------  */
+
+in vec2 texCoord_interp;
+out vec4 fragColor;
+
+void main()
+{
+  vec4 col = texture(image_texture, texCoord_interp.st);
+  vec4 col_overlay = texture(overlay_texture, texCoord_interp.st);
+  vec2 noise_uv = round_to_pixel(image_texture, texCoord_interp.st);
+
+  fragColor

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list