[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