diff options
author | Habib Gahbiche <zazizizou> | 2021-03-29 08:44:27 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2021-03-29 08:56:58 +0300 |
commit | 805d9478109e76ca221f202ff152bae685f77ff4 (patch) | |
tree | 61b5b35de39fcdae1f31da98be39155f6d215386 /source/blender/compositor/nodes | |
parent | 6af4163a3f190ed8b33a622ac038d9df88757a20 (diff) |
Compositor: Add Anti-Aliasing node
This is an implementation of Enhanced Subpixel Morphological Antialiasing (SMAA)
The algorithm was proposed by:
Jorge Jimenez, Jose I. Echevarria, Tiago Sousa, Diego Gutierrez
This node provides only SMAA 1x mode, so the operation will be done with no spatial
multisampling nor temporal supersampling. See Patch for comparisons.
The existing AA operation seems to be used only for binary images by some other nodes.
Using SMAA for binary images needs no important parameter such as "threshold", so we
perhaps can switch the operation to SMAA, though that changes existing behavior.
Notes:
1. The program code assumes the screen coordinates are DirectX style that the
vertical direction is upside-down, so "top" and "bottom" actually represent bottom
and top, respectively.
Thanks for Habib Gahbiche (zazizizou) to polish and finalize this patch.
Reviewed By: jbakker
Differential Revision: https://developer.blender.org/D2411
Diffstat (limited to 'source/blender/compositor/nodes')
-rw-r--r-- | source/blender/compositor/nodes/COM_AntiAliasingNode.cc | 56 | ||||
-rw-r--r-- | source/blender/compositor/nodes/COM_AntiAliasingNode.h | 38 |
2 files changed, 94 insertions, 0 deletions
diff --git a/source/blender/compositor/nodes/COM_AntiAliasingNode.cc b/source/blender/compositor/nodes/COM_AntiAliasingNode.cc new file mode 100644 index 00000000000..8ed627cbab6 --- /dev/null +++ b/source/blender/compositor/nodes/COM_AntiAliasingNode.cc @@ -0,0 +1,56 @@ +/* + * Copyright 2017, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: IRIE Shinsuke + */ + +#include "COM_AntiAliasingNode.h" +#include "COM_SMAAOperation.h" +#include "DNA_node_types.h" + +void AntiAliasingNode::convertToOperations(NodeConverter &converter, + const CompositorContext & /*context*/) const +{ + bNode *node = this->getbNode(); + NodeAntiAliasingData *data = (NodeAntiAliasingData *)node->storage; + + /* Edge Detection (First Pass) */ + SMAAEdgeDetectionOperation *operation1 = nullptr; + + operation1 = new SMAAEdgeDetectionOperation(); + operation1->setThreshold(data->threshold); + operation1->setLocalContrastAdaptationFactor(data->contrast_limit); + converter.addOperation(operation1); + + converter.mapInputSocket(getInputSocket(0), operation1->getInputSocket(0)); + + /* Blending Weight Calculation Pixel Shader (Second Pass) */ + SMAABlendingWeightCalculationOperation *operation2 = + new SMAABlendingWeightCalculationOperation(); + operation2->setCornerRounding(data->corner_rounding); + converter.addOperation(operation2); + + converter.addLink(operation1->getOutputSocket(), operation2->getInputSocket(0)); + + /* Neighborhood Blending Pixel Shader (Third Pass) */ + SMAANeighborhoodBlendingOperation *operation3 = new SMAANeighborhoodBlendingOperation(); + converter.addOperation(operation3); + + converter.mapInputSocket(getInputSocket(0), operation3->getInputSocket(0)); + converter.addLink(operation2->getOutputSocket(), operation3->getInputSocket(1)); + converter.mapOutputSocket(getOutputSocket(0), operation3->getOutputSocket()); +} diff --git a/source/blender/compositor/nodes/COM_AntiAliasingNode.h b/source/blender/compositor/nodes/COM_AntiAliasingNode.h new file mode 100644 index 00000000000..c0eafc013cc --- /dev/null +++ b/source/blender/compositor/nodes/COM_AntiAliasingNode.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: IRIE Shinsuke + */ + +#ifndef _COM_AntiAliasingNode_h_ +#define _COM_AntiAliasingNode_h_ + +#include "COM_Node.h" + +/** + * @brief AntiAliasingNode + * @ingroup Node + */ +class AntiAliasingNode : public Node { + public: + AntiAliasingNode(bNode *editorNode) : Node(editorNode) + { + } + void convertToOperations(NodeConverter &converter, const CompositorContext &context) const; +}; + +#endif |