diff options
author | Manuel Castilla <manzanillawork@gmail.com> | 2021-09-19 21:12:53 +0300 |
---|---|---|
committer | Manuel Castilla <manzanillawork@gmail.com> | 2021-09-19 22:13:51 +0300 |
commit | 276eebb274744d819dcdab8a95770dd7382c0664 (patch) | |
tree | 2f1ab6ee7c3b87eb297143c32f4a2c09bd714f0c /source/blender/compositor/nodes | |
parent | f256bfb3e26c32af12c82dbd32d4b3bcfba252f3 (diff) |
Compositor: Add OIDN prefiltering option to Denoise node
It's equivalent to the OpenImageDenoise prefiltering option in Cycles.
See D12043.
Prefilter modes:
- None: No prefiltering, use when guiding passes are noise-free.
- Fast: Denoise image and guiding passes together. Improves quality when
guiding passes are noisy using least amount of extra processing time.
- Accurate: Prefilter noisy guiding passes before denoising image.
Improves quality when guiding passes are noisy using extra
processing time.
Reviewed By: #compositing, jbakker, sergey
Differential Revision: https://developer.blender.org/D12342
Diffstat (limited to 'source/blender/compositor/nodes')
-rw-r--r-- | source/blender/compositor/nodes/COM_DenoiseNode.cc | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/source/blender/compositor/nodes/COM_DenoiseNode.cc b/source/blender/compositor/nodes/COM_DenoiseNode.cc index e58a9c7ba9a..cc9328414ef 100644 --- a/source/blender/compositor/nodes/COM_DenoiseNode.cc +++ b/source/blender/compositor/nodes/COM_DenoiseNode.cc @@ -31,6 +31,12 @@ DenoiseNode::DenoiseNode(bNode *editorNode) : Node(editorNode) void DenoiseNode::convertToOperations(NodeConverter &converter, const CompositorContext & /*context*/) const { + if (!COM_is_denoise_supported()) { + converter.mapOutputSocket(getOutputSocket(0), + converter.addInputProxy(getInputSocket(0), false)); + return; + } + bNode *node = this->getbNode(); NodeDenoise *denoise = (NodeDenoise *)node->storage; @@ -39,8 +45,28 @@ void DenoiseNode::convertToOperations(NodeConverter &converter, operation->setDenoiseSettings(denoise); converter.mapInputSocket(getInputSocket(0), operation->getInputSocket(0)); - converter.mapInputSocket(getInputSocket(1), operation->getInputSocket(1)); - converter.mapInputSocket(getInputSocket(2), operation->getInputSocket(2)); + if (denoise && denoise->prefilter == CMP_NODE_DENOISE_PREFILTER_ACCURATE) { + { + DenoisePrefilterOperation *normal_prefilter = new DenoisePrefilterOperation( + DataType::Vector); + normal_prefilter->set_image_name("normal"); + converter.addOperation(normal_prefilter); + converter.mapInputSocket(getInputSocket(1), normal_prefilter->getInputSocket(0)); + converter.addLink(normal_prefilter->getOutputSocket(), operation->getInputSocket(1)); + } + { + DenoisePrefilterOperation *albedo_prefilter = new DenoisePrefilterOperation(DataType::Color); + albedo_prefilter->set_image_name("albedo"); + converter.addOperation(albedo_prefilter); + converter.mapInputSocket(getInputSocket(2), albedo_prefilter->getInputSocket(0)); + converter.addLink(albedo_prefilter->getOutputSocket(), operation->getInputSocket(2)); + } + } + else { + converter.mapInputSocket(getInputSocket(1), operation->getInputSocket(1)); + converter.mapInputSocket(getInputSocket(2), operation->getInputSocket(2)); + } + converter.mapOutputSocket(getOutputSocket(0), operation->getOutputSocket(0)); } |