[Bf-blender-cvs] [610b67e13ba] viewport-compositor: Viewport Compositor: Average RGB for link conversion

Omar Emara noreply at git.blender.org
Thu Jan 6 17:29:42 CET 2022


Commit: 610b67e13ba1404d9b3196950b6dbbb552869cbb
Author: Omar Emara
Date:   Mon Jan 3 22:50:22 2022 +0200
Branches: viewport-compositor
https://developer.blender.org/rB610b67e13ba1404d9b3196950b6dbbb552869cbb

Viewport Compositor: Average RGB for link conversion

This patch changes the link conversion operation for the compositor
shader to be an RGB average to match the Blender compositor. Compositor
shaders are now marked with a COMPOSITOR_SHADER definition.

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

M	source/blender/draw/engines/compositor/compositor_shader.cc
M	source/blender/draw/engines/compositor/compositor_shader.hh
M	source/blender/gpu/shaders/gpu_shader_codegen_lib.glsl

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

diff --git a/source/blender/draw/engines/compositor/compositor_shader.cc b/source/blender/draw/engines/compositor/compositor_shader.cc
index 3db6bdee6e8..d9e8e4b5f79 100644
--- a/source/blender/draw/engines/compositor/compositor_shader.cc
+++ b/source/blender/draw/engines/compositor/compositor_shader.cc
@@ -77,6 +77,14 @@ char *ShaderModule::pass_shader_code_frag_get(const GPUCodegenOutput *codegen,
   return DRW_shader_library_create_shader_string(shader_lib_, output.c_str());
 }
 
+char *ShaderModule::pass_shader_code_defs_get()
+{
+  std::string defines = "";
+  defines += "#define COMPOSITOR_SHADER\n";
+
+  return BLI_strdup(defines.c_str());
+}
+
 /* WATCH: This can be called from another thread! Needs to not touch the shader module in any
  * thread unsafe manner. */
 GPUShaderSource ShaderModule::pass_shader_code_generate(const GPUCodegenOutput *codegen,
@@ -86,7 +94,7 @@ GPUShaderSource ShaderModule::pass_shader_code_generate(const GPUCodegenOutput *
   source.vertex = pass_shader_code_vert_get(codegen, gpumat);
   source.fragment = pass_shader_code_frag_get(codegen, gpumat);
   source.geometry = nullptr;
-  source.defines = nullptr;
+  source.defines = pass_shader_code_defs_get();
   return source;
 }
 
diff --git a/source/blender/draw/engines/compositor/compositor_shader.hh b/source/blender/draw/engines/compositor/compositor_shader.hh
index ae7cd70eda9..4ab92534c41 100644
--- a/source/blender/draw/engines/compositor/compositor_shader.hh
+++ b/source/blender/draw/engines/compositor/compositor_shader.hh
@@ -40,6 +40,7 @@ class ShaderModule {
  private:
   char *pass_shader_code_vert_get(const GPUCodegenOutput *codegen, GPUMaterial *gpumat);
   char *pass_shader_code_frag_get(const GPUCodegenOutput *codegen, GPUMaterial *gpumat);
+  char *pass_shader_code_defs_get();
 };
 
 }  // namespace blender::compositor
diff --git a/source/blender/gpu/shaders/gpu_shader_codegen_lib.glsl b/source/blender/gpu/shaders/gpu_shader_codegen_lib.glsl
index 086ff5b0217..b0c28823a9c 100644
--- a/source/blender/gpu/shaders/gpu_shader_codegen_lib.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_codegen_lib.glsl
@@ -1,6 +1,10 @@
-
-/* Assumes GPU_VEC4 is color data. So converting to luminance like cycles. */
-#define float_from_vec4(v) dot(v.rgb, vec3(0.2126, 0.7152, 0.0722))
+/* Assumes GPU_VEC4 is color data. If this is a compositor shader, take the average of the
+ * components, otherwise, apply the luminance coefficients used by Cycles. */
+#ifdef COMPOSITOR_SHADER
+#  define float_from_vec4(v) ((v.r + v.g + v.b) / 3.0)
+#else
+#  define float_from_vec4(v) dot(v.rgb, vec3(0.2126, 0.7152, 0.0722))
+#endif
 #define float_from_vec3(v) avg(v.rgb)
 #define float_from_vec2(v) v.r



More information about the Bf-blender-cvs mailing list