[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