Commit: f1673d20fa645b895cfa9d67e76dd29df7c739a2
Author: Lukas Stockner
Date:   Thu Aug 30 23:28:10 2018 +0200
Branches: master
https://developer.blender.org/rBf1673d20fa645b895cfa9d67e76dd29df7c739a2

Cycles: Expose noisy image pass by default when rendering with denoiser

Apparently quite a few users would like to have the noisy pass available when 
using the denoiser, and since it's being generated anyways we might as well 
expose it by default.

Reviewers: brecht

Differential Revision: https://developer.blender.org/D3608

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

M       intern/cycles/blender/addon/engine.py
M       intern/cycles/blender/blender_sync.cpp
M       intern/cycles/render/buffers.cpp

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

diff --git a/intern/cycles/blender/addon/engine.py 
b/intern/cycles/blender/addon/engine.py
index 87dcbe486c7..16ec7bc314b 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -254,21 +254,21 @@ def register_passes(engine, scene, srl):
     if crl.use_pass_volume_indirect:           engine.register_pass(scene, 
srl, "VolumeInd",                     3, "RGB", 'COLOR')
 
     cscene = scene.cycles
-    if crl.use_denoising and crl.denoising_store_passes and not 
cscene.use_progressive_refine:
-        engine.register_pass(scene, srl, "Denoising Normal",          3, 
"XYZ", 'VECTOR')
-        engine.register_pass(scene, srl, "Denoising Normal Variance", 3, 
"XYZ", 'VECTOR')
-        engine.register_pass(scene, srl, "Denoising Albedo",          3, 
"RGB", 'COLOR')
-        engine.register_pass(scene, srl, "Denoising Albedo Variance", 3, 
"RGB", 'COLOR')
-        engine.register_pass(scene, srl, "Denoising Depth",           1, "Z",  
 'VALUE')
-        engine.register_pass(scene, srl, "Denoising Depth Variance",  1, "Z",  
 'VALUE')
-        engine.register_pass(scene, srl, "Denoising Shadow A",        3, 
"XYV", 'VECTOR')
-        engine.register_pass(scene, srl, "Denoising Shadow B",        3, 
"XYV", 'VECTOR')
-        engine.register_pass(scene, srl, "Denoising Image",           3, 
"RGB", 'COLOR')
-        engine.register_pass(scene, srl, "Denoising Image Variance",  3, 
"RGB", 'COLOR')
-
-        clean_options = ("denoising_diffuse_direct", 
"denoising_diffuse_indirect",
-                         "denoising_glossy_direct", 
"denoising_glossy_indirect",
-                         "denoising_transmission_direct", 
"denoising_transmission_indirect",
-                         "denoising_subsurface_direct", 
"denoising_subsurface_indirect")
-        if any(getattr(crl, option) for option in clean_options):
-            engine.register_pass(scene, srl, "Denoising Clean", 3, "RGB", 
'COLOR')
+    if crl.use_denoising:
+        engine.register_pass(scene, srl, "Noisy Image", 3, "RGBA", 'COLOR')
+        if crl.denoising_store_passes:
+            engine.register_pass(scene, srl, "Denoising Normal",          3, 
"XYZ", 'VECTOR')
+            engine.register_pass(scene, srl, "Denoising Normal Variance", 3, 
"XYZ", 'VECTOR')
+            engine.register_pass(scene, srl, "Denoising Albedo",          3, 
"RGB", 'COLOR')
+            engine.register_pass(scene, srl, "Denoising Albedo Variance", 3, 
"RGB", 'COLOR')
+            engine.register_pass(scene, srl, "Denoising Depth",           1, 
"Z",   'VALUE')
+            engine.register_pass(scene, srl, "Denoising Depth Variance",  1, 
"Z",   'VALUE')
+            engine.register_pass(scene, srl, "Denoising Shadow A",        3, 
"XYV", 'VECTOR')
+            engine.register_pass(scene, srl, "Denoising Shadow B",        3, 
"XYV", 'VECTOR')
+            engine.register_pass(scene, srl, "Denoising Image Variance",  3, 
"RGB", 'COLOR')
+            clean_options = ("denoising_diffuse_direct", 
"denoising_diffuse_indirect",
+                             "denoising_glossy_direct", 
"denoising_glossy_indirect",
+                             "denoising_transmission_direct", 
"denoising_transmission_indirect",
+                             "denoising_subsurface_direct", 
"denoising_subsurface_indirect")
+            if any(getattr(crl, option) for option in clean_options):
+                engine.register_pass(scene, srl, "Denoising Clean", 3, "RGB", 
'COLOR')
diff --git a/intern/cycles/blender/blender_sync.cpp 
b/intern/cycles/blender/blender_sync.cpp
index 5e47252e336..8ae52beb1c1 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -525,6 +525,9 @@ PassType BlenderSync::get_pass_type(BL::RenderPass& b_pass)
 int BlenderSync::get_denoising_pass(BL::RenderPass& b_pass)
 {
        string name = b_pass.name();
+
+       if(name == "Noisy Image") return DENOISING_PASS_COLOR;
+
        if(name.substr(0, 10) != "Denoising ") {
                return -1;
        }
@@ -539,7 +542,6 @@ int BlenderSync::get_denoising_pass(BL::RenderPass& b_pass)
        MAP_PASS("Depth Variance", DENOISING_PASS_DEPTH_VAR);
        MAP_PASS("Shadow A", DENOISING_PASS_SHADOW_A);
        MAP_PASS("Shadow B", DENOISING_PASS_SHADOW_B);
-       MAP_PASS("Image", DENOISING_PASS_COLOR);
        MAP_PASS("Image Variance", DENOISING_PASS_COLOR_VAR);
        MAP_PASS("Clean", DENOISING_PASS_CLEAN);
 #undef MAP_PASS
@@ -573,20 +575,8 @@ array<Pass> 
BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
 
        scene->film->denoising_flags = 0;
        PointerRNA crp = RNA_pointer_get(&b_srlay.ptr, "cycles");
-       if(get_boolean(crp, "denoising_store_passes") &&
-          get_boolean(crp, "use_denoising"))
+       if(get_boolean(crp, "use_denoising"))
        {
-               b_engine.add_pass("Denoising Normal",          3, "XYZ", 
b_srlay.name().c_str());
-               b_engine.add_pass("Denoising Normal Variance", 3, "XYZ", 
b_srlay.name().c_str());
-               b_engine.add_pass("Denoising Albedo",          3, "RGB", 
b_srlay.name().c_str());
-               b_engine.add_pass("Denoising Albedo Variance", 3, "RGB", 
b_srlay.name().c_str());
-               b_engine.add_pass("Denoising Depth",           1, "Z",   
b_srlay.name().c_str());
-               b_engine.add_pass("Denoising Depth Variance",  1, "Z",   
b_srlay.name().c_str());
-               b_engine.add_pass("Denoising Shadow A",        3, "XYV", 
b_srlay.name().c_str());
-               b_engine.add_pass("Denoising Shadow B",        3, "XYV", 
b_srlay.name().c_str());
-               b_engine.add_pass("Denoising Image",           3, "RGB", 
b_srlay.name().c_str());
-               b_engine.add_pass("Denoising Image Variance",  3, "RGB", 
b_srlay.name().c_str());
-
 #define MAP_OPTION(name, flag) if(!get_boolean(crp, name)) 
scene->film->denoising_flags |= flag;
                MAP_OPTION("denoising_diffuse_direct",        
DENOISING_CLEAN_DIFFUSE_DIR);
                MAP_OPTION("denoising_diffuse_indirect",      
DENOISING_CLEAN_DIFFUSE_IND);
@@ -598,8 +588,21 @@ array<Pass> 
BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
                MAP_OPTION("denoising_subsurface_indirect",   
DENOISING_CLEAN_SUBSURFACE_IND);
 #undef MAP_OPTION
 
-               if(scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES) {
-                       b_engine.add_pass("Denoising Clean", 3, "RGB", 
b_srlay.name().c_str());
+               b_engine.add_pass("Noisy Image", 4, "RGBA", 
b_srlay.name().c_str());
+               if(get_boolean(crp, "denoising_store_passes")) {
+                       b_engine.add_pass("Denoising Normal",          3, 
"XYZ", b_srlay.name().c_str());
+                       b_engine.add_pass("Denoising Normal Variance", 3, 
"XYZ", b_srlay.name().c_str());
+                       b_engine.add_pass("Denoising Albedo",          3, 
"RGB", b_srlay.name().c_str());
+                       b_engine.add_pass("Denoising Albedo Variance", 3, 
"RGB", b_srlay.name().c_str());
+                       b_engine.add_pass("Denoising Depth",           1, "Z",  
 b_srlay.name().c_str());
+                       b_engine.add_pass("Denoising Depth Variance",  1, "Z",  
 b_srlay.name().c_str());
+                       b_engine.add_pass("Denoising Shadow A",        3, 
"XYV", b_srlay.name().c_str());
+                       b_engine.add_pass("Denoising Shadow B",        3, 
"XYV", b_srlay.name().c_str());
+                       b_engine.add_pass("Denoising Image Variance",  3, 
"RGB", b_srlay.name().c_str());
+
+                       if(scene->film->denoising_flags & 
DENOISING_CLEAN_ALL_PASSES) {
+                               b_engine.add_pass("Denoising Clean",   3, 
"RGB", b_srlay.name().c_str());
+                       }
                }
        }
 #ifdef __KERNEL_DEBUG__
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 4cd8b3726d3..e6021f4b37d 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -160,11 +160,12 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, 
float exposure, int samp
                        (offset == DENOISING_PASS_DEPTH_VAR) ||
                        (offset == DENOISING_PASS_COLOR_VAR);
 
+       float scale_exposure = scale;
        if(offset == DENOISING_PASS_COLOR || offset == DENOISING_PASS_CLEAN) {
-               scale *= exposure;
+               scale_exposure *= exposure;
        }
        else if(offset == DENOISING_PASS_COLOR_VAR) {
-               scale *= exposure*exposure;
+               scale_exposure *= exposure*exposure;
        }
 
        offset += params.get_denoising_offset();
@@ -181,14 +182,14 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, 
float exposure, int samp
 
                if(components == 1) {
                        for(int i = 0; i < size; i++, mean += pass_stride, var 
+= pass_stride, pixels++) {
-                               pixels[0] = max(0.0f, var[0] - 
mean[0]*mean[0]*invsample)*scale;
+                               pixels[0] = max(0.0f, var[0] - 
mean[0]*mean[0]*invsample)*scale_exposure;
                        }
                }
                else if(components == 3) {
                        for(int i = 0; i < size; i++, mean += pass_stride, var 
+= pass_stride, pixels += 3) {
-                               pixels[0] = max(0.0f, var[0] - 
mean[0]*mean[0]*invsample)*scale;
-                               pixels[1] = max(0.0f, var[1] - 
mean[1]*mean[1]*invsample)*scale;
-                               pixels[2] = max(0.0f, var[2] - 
mean[2]*mean[2]*invsample)*scale;
+                               pixels[0] = max(0.0f, var[0] - 
mean[0]*mean[0]*invsample)*scale_exposure;
+                               pixels[1] = max(0.0f, var[1] - 
mean[1]*mean[1]*invsample)*scale_exposure;
+                               pixels[2] = max(0.0f, var[2] - 
mean[2]*mean[2]*invsample)*scale_exposure;
                        }
                }
                else {
@@ -200,14 +201,28 @@ bool RenderBuffers::get_denoising_pass_rect(int offset, 
float exposure, int samp
 
                if(components == 1) {
                        for(int i = 0; i < size; i++, in += pass_stride, 
pixels++) {
-                               pixels[0] = in[0]*scale;
+                               pixels[0] = in[0]*scale_exposure;
                        }
                }
                else if(components == 3) {
                        for(int i = 0; i < size; i++, in += pass_stride, pixels 
+= 3) {
-                               pixels[0] = in[0]*scale;
-                               pixels[1] = in[1]*scale;
-                               pixels[2] = in[2]*scale;
+                               pixels[0] = in[0]*scale_exposure;
+                               pixels[1] = in[1]*scale_exposure;
+                               pixels[2] = in[2]*scale_exposure;
+                       }
+               }
+               else if(components == 4) {
+                       assert(offset == DENOISING_PASS_COLOR);
+
+                       /* Since the alpha channel is not involved in 
denoising, output the Combined alpha channel. */
+                       assert(params.passes[0].type == PASS_COMBINED);
+                       float *in_combined = buffer.data();
+
+                       for(int i = 0; i < size; i++, in += pass_stride, 
in_combined += pass_stride, pixels += 4) {
+                               pixels[0] = in[0]*scale_exposure;
+                               pixels[1] = in[1]*scale_exposure;
+                               pixels[2] = in[2]*scale_exposure;
+                               pixels[3] = saturate(in_combined[3]*scale);
                        }
                }
                else {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to