[Bf-blender-cvs] [0f784485bd6] temp-image-buffer-rasterizer: Added blending modes.

Jeroen Bakker noreply at git.blender.org
Wed Mar 2 15:08:14 CET 2022


Commit: 0f784485bd651c629063ec37612bf366b174fd4a
Author: Jeroen Bakker
Date:   Wed Mar 2 15:08:04 2022 +0100
Branches: temp-image-buffer-rasterizer
https://developer.blender.org/rB0f784485bd651c629063ec37612bf366b174fd4a

Added blending modes.

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

M	source/blender/imbuf/IMB_rasterizer.hh
A	source/blender/imbuf/intern/rasterizer_blending.hh
M	source/blender/imbuf/intern/rasterizer_test.cc

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

diff --git a/source/blender/imbuf/IMB_rasterizer.hh b/source/blender/imbuf/IMB_rasterizer.hh
index facc67a0da9..876c188ad01 100644
--- a/source/blender/imbuf/IMB_rasterizer.hh
+++ b/source/blender/imbuf/IMB_rasterizer.hh
@@ -71,6 +71,7 @@
 #include "IMB_imbuf.h"
 #include "IMB_imbuf_types.h"
 
+#include "intern/rasterizer_blending.hh"
 #include "intern/rasterizer_clamping.hh"
 #include "intern/rasterizer_stats.hh"
 #include "intern/rasterizer_target.hh"
@@ -241,6 +242,10 @@ template<typename Rasterline, int64_t BufferSize> class Rasterlines {
 
 template<typename VertexShader,
          typename FragmentShader,
+         /**
+          * A blend mode integrates the result of the fragment shader with the drawing target.
+          */
+         typename BlendMode = CopyBlendMode,
          typename DrawingTarget = ImageBufferDrawingTarget,
 
          /**
@@ -268,15 +273,16 @@ class Rasterizer {
 
   /** Check if the vertex shader and the fragment shader can be linked together. */
   static_assert(std::is_same_v<InterfaceInnerType, FragmentInputType>);
+  /** Check if the output of the fragment shader can be used as source of the Blend Mode. */
+  static_assert(std::is_same_v<FragmentOutputType, typename BlendMode::SourceType>);
 
  private:
   VertexShader vertex_shader_;
   FragmentShader fragment_shader_;
   Rasterlines<RasterlineType, RasterlinesSize> rasterlines_;
-  /** Active image buffer that is used as drawing target. */
-
   const CenterPixelClampingMethod clamping_method;
-  ImageBufferDrawingTarget drawing_target_;
+  const BlendMode blending_mode_;
+  DrawingTarget drawing_target_;
 
  public:
   Statistics stats;
@@ -683,7 +689,7 @@ class Rasterizer {
 
       FragmentOutputType fragment_out;
       fragment_shader_.fragment(data, &fragment_out);
-      copy_v4_v4(pixel_ptr, &fragment_out[0]);
+      blending_mode_.blend(pixel_ptr, fragment_out);
 
       data += rasterline.fragment_add;
       pixel_ptr += drawing_target_.get_pixel_stride();
diff --git a/source/blender/imbuf/intern/rasterizer_blending.hh b/source/blender/imbuf/intern/rasterizer_blending.hh
new file mode 100644
index 00000000000..14dbaadfc95
--- /dev/null
+++ b/source/blender/imbuf/intern/rasterizer_blending.hh
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2022 Blender Foundation. All rights reserved. */
+
+#pragma once
+
+#include "BLI_math.h"
+#include "BLI_math_vec_types.hh"
+#include "BLI_sys_types.h"
+
+namespace blender::imbuf::rasterizer {
+
+/** How to integrate the result of a fragment shader into its drawing target. */
+template<typename Source, typename Destination> class AbstractBlendMode {
+ public:
+  using SourceType = Source;
+  using DestinationType = Destination;
+
+  virtual void blend(Destination *dest, const Source &source) const = 0;
+};
+
+/**
+ * Copy the result of the fragment shader into float[4] without any modifications.
+ */
+class CopyBlendMode : public AbstractBlendMode<float4, float> {
+ public:
+  void blend(float *dest, const float4 &source) const override
+  {
+    copy_v4_v4(dest, source);
+  }
+};
+
+}  // namespace blender::imbuf::rasterizer
diff --git a/source/blender/imbuf/intern/rasterizer_test.cc b/source/blender/imbuf/intern/rasterizer_test.cc
index 608dcb43833..ccc61d55ed9 100644
--- a/source/blender/imbuf/intern/rasterizer_test.cc
+++ b/source/blender/imbuf/intern/rasterizer_test.cc
@@ -42,6 +42,7 @@ class FragmentShader : public AbstractFragmentShader<float4, float4> {
 
 using RasterizerType = Rasterizer<VertexShader,
                                   FragmentShader,
+                                  CopyBlendMode,
                                   ImageBufferDrawingTarget,
                                   DefaultRasterlinesBufferSize,
                                   Stats>;



More information about the Bf-blender-cvs mailing list