Commit: 5c4b97a13060b1936235e19b3707ceea853ad082
Author: Lukas Stockner
Date:   Wed Nov 16 17:18:10 2016 +0100
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB5c4b97a13060b1936235e19b3707ceea853ad082

Cycles: Add options for NLM and collaborative filtering

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

M       intern/cycles/blender/addon/ui.py
M       intern/cycles/blender/blender_session.cpp
M       intern/cycles/device/device_cpu.cpp
M       intern/cycles/device/device_cuda.cpp
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/render/integrator.cpp
M       intern/cycles/render/integrator.h
M       source/blender/makesdna/DNA_scene_types.h
M       source/blender/makesrna/intern/rna_scene.c

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

diff --git a/intern/cycles/blender/addon/ui.py 
b/intern/cycles/blender/addon/ui.py
index 093340d..a79def8 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -578,6 +578,8 @@ class CyclesRender_PT_denoising(CyclesButtonsPanel, Panel):
         sub.prop(rl, "half_window")
         sub.prop(rl, "filter_strength", slider=True)
         sub.prop(rl, "filter_weighting_adjust", slider=True)
+        sub.prop(rl, "filter_collaborative")
+        sub.prop(rl, "filter_use_nlm_weights")
 
         sub = col.column(align=True)
         row = sub.row(align=True)
diff --git a/intern/cycles/blender/blender_session.cpp 
b/intern/cycles/blender/blender_session.cpp
index edb18bf..d629e55 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -466,6 +466,8 @@ void BlenderSession::render()
                scene->integrator->half_window = b_layer_iter->half_window();
                scene->integrator->filter_strength = powf(2.0f, 
b_layer_iter->filter_strength());
                scene->integrator->weighting_adjust = powf(2.0f, 
b_layer_iter->filter_weighting_adjust());
+               scene->integrator->use_nlm_weights = 
b_layer_iter->filter_use_nlm_weights();
+               scene->integrator->use_collaborative_filtering = 
b_layer_iter->filter_collaborative();
 
                scene->film->pass_alpha_threshold = 
b_layer_iter->pass_alpha_threshold();
                scene->film->tag_passes_update(scene, passes);
diff --git a/intern/cycles/device/device_cpu.cpp 
b/intern/cycles/device/device_cpu.cpp
index 3465a10..c2b6ea7 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -434,8 +434,8 @@ public:
        {
                bool old_filter = getenv("OLD_FILTER");
                bool only_nlm_filter = getenv("ONLY_NLM_FILTER");
-               bool nlm_filter = getenv("NLM_FILTER");
                bool use_collaborative_filtering = 
kg->__data.integrator.use_collaborative_filtering;
+               bool nlm_weights = kg->__data.integrator.use_nlm_weights;
 
                FilterStorage *storage = new 
FilterStorage[filter_area.z*filter_area.w];
                int hw = kg->__data.integrator.half_window;
@@ -494,7 +494,7 @@ public:
                                }
                        }
                }
-               else if(nlm_filter) {
+               else if(nlm_weights) {
                        for(int y = 0; y < filter_area.w; y++) {
                                for(int x = 0; x < filter_area.z; x++) {
                                        filter_construct_transform_kernel()(kg, 
sample, filter_buffer, x + filter_area.x, y + filter_area.y, storage + 
y*filter_area.z + x, &rect.x);
diff --git a/intern/cycles/device/device_cuda.cpp 
b/intern/cycles/device/device_cuda.cpp
index e721118..1f2cfdc 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -1116,7 +1116,7 @@ public:
                                           xthreads, ythreads, 1, /* threads */
                                           0, 0, transform_args, 0));
 
-               if(getenv("NLM_FILTER")) {
+               if(kernel_globals.integrator.use_nlm_weights) {
                        void *final_args[] = {&sample,
                                              &d_denoise_buffers,
                                              &rtile.offset,
diff --git a/intern/cycles/kernel/kernel_types.h 
b/intern/cycles/kernel/kernel_types.h
index 904598f..4ffa03d 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1164,8 +1164,7 @@ typedef struct KernelIntegrator {
        float filter_strength;
        float weighting_adjust;
        int use_collaborative_filtering;
-
-       int pad1;
+       int use_nlm_weights;
 } KernelIntegrator;
 static_assert_align(KernelIntegrator, 16);
 
diff --git a/intern/cycles/render/integrator.cpp 
b/intern/cycles/render/integrator.cpp
index 7af07f0..f1e84e6 100644
--- a/intern/cycles/render/integrator.cpp
+++ b/intern/cycles/render/integrator.cpp
@@ -80,6 +80,8 @@ NODE_DEFINE(Integrator)
        SOCKET_INT(half_window, "Half Window", 8);
        SOCKET_FLOAT(filter_strength, "Filter Strength", 0.0f);
        SOCKET_FLOAT(weighting_adjust, "Weighting Adjust", 1.0f);
+       SOCKET_BOOLEAN(use_nlm_weights, "Use NLM weights", true);
+       SOCKET_BOOLEAN(use_collaborative_filtering, "Use Collaborative 
Filtering", true);
 
        return type;
 }
@@ -210,7 +212,8 @@ void Integrator::device_update(Device *device, DeviceScene 
*dscene, Scene *scene
        kintegrator->half_window = half_window;
        kintegrator->filter_strength = filter_strength;
        kintegrator->weighting_adjust = weighting_adjust;
-       kintegrator->use_collaborative_filtering = false;
+       kintegrator->use_collaborative_filtering = use_collaborative_filtering;
+       kintegrator->use_nlm_weights = use_nlm_weights;
 
        need_update = false;
 }
diff --git a/intern/cycles/render/integrator.h 
b/intern/cycles/render/integrator.h
index 7561dbd..444b0ed 100644
--- a/intern/cycles/render/integrator.h
+++ b/intern/cycles/render/integrator.h
@@ -85,6 +85,8 @@ public:
        int half_window;
        float filter_strength;
        float weighting_adjust;
+       bool use_nlm_weights;
+       bool use_collaborative_filtering;
 
        Integrator();
        ~Integrator();
diff --git a/source/blender/makesdna/DNA_scene_types.h 
b/source/blender/makesdna/DNA_scene_types.h
index 103c4d1..71bee61 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -266,6 +266,8 @@ typedef enum SceneDenoiseFlag {
        SCE_DENOISE_TRANSIND              = (1 << 7),
        SCE_DENOISE_SUBDIR                = (1 << 8),
        SCE_DENOISE_SUBIND                = (1 << 9),
+       SCE_DENOISE_NLM_WEIGHTS           = (1 << 10),
+       SCE_DENOISE_COLLABORATIVE         = (1 << 11),
 } SceneDenoiseFlag;
 
 /* srl->passflag */
diff --git a/source/blender/makesrna/intern/rna_scene.c 
b/source/blender/makesrna/intern/rna_scene.c
index 0d272d1..90a7ad0 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -5018,6 +5018,16 @@ static void rna_def_scene_render_layer(BlenderRNA *brna)
        RNA_def_property_range(prop, 1, 50);
        RNA_def_property_ui_text(prop, "Half window", "Size of the filter 
window (the pixel area used for denoising one pixel). Higher values get rid of 
more noise, but might lose detail and are slower");
        RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+       prop = RNA_def_property(srna, "filter_use_nlm_weights", PROP_BOOLEAN, 
PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", 
SCE_DENOISE_NLM_WEIGHTS);
+       RNA_def_property_ui_text(prop, "Use NLM weights", "Use Non-Local means 
for weighting the pixels");
+       RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
+
+       prop = RNA_def_property(srna, "filter_collaborative", PROP_BOOLEAN, 
PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "denoiseflag", 
SCE_DENOISE_COLLABORATIVE);
+       RNA_def_property_ui_text(prop, "Use collaborative denoising", "Use 
aditional predictions of neighboring pixels to get a cleaner result. Might 
cause visible tile borders.");
+       RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
 }
 
 /* Render Layers */

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

Reply via email to