Commit: b5c773469ec4646fa23848234d90266ded4a508f
Author: Lukas Stockner
Date:   Sat Aug 6 05:00:58 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBb5c773469ec4646fa23848234d90266ded4a508f

Cycles: Implement the Filter Weight functionality

For now, the slider defines the weight given to feature pass variances (which 
now is 2**filter_strength instead of 1).

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

M       intern/cycles/blender/blender_session.cpp
M       intern/cycles/kernel/kernel_filter.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/render/integrator.cpp
M       intern/cycles/render/integrator.h
M       source/blender/makesrna/intern/rna_scene.c

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

diff --git a/intern/cycles/blender/blender_session.cpp 
b/intern/cycles/blender/blender_session.cpp
index 84bcd26..4274fa9 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -464,6 +464,7 @@ void BlenderSession::render()
                scene->film->selective_denoising = (scene->film->denoise_flags 
!= DENOISE_ALL);
                buffer_params.selective_denoising = 
scene->film->selective_denoising;
                scene->integrator->half_window = b_layer_iter->half_window();
+               scene->integrator->filter_strength = powf(2.0f, 
b_layer_iter->filter_strength());
 
                scene->film->pass_alpha_threshold = 
b_layer_iter->pass_alpha_threshold();
                scene->film->tag_passes_update(scene, passes);
diff --git a/intern/cycles/kernel/kernel_filter.h 
b/intern/cycles/kernel/kernel_filter.h
index c2f5b54..64b87bd 100644
--- a/intern/cycles/kernel/kernel_filter.h
+++ b/intern/cycles/kernel/kernel_filter.h
@@ -327,10 +327,10 @@ ccl_device void 
kernel_filter_estimate_params(KernelGlobals *kg, int sample, flo
 
                filter_get_feature_variance(px, py, buffer, pre_buffer, sample, 
features, feature_scale, pre_stride);
 #ifdef FULL_EIGENVALUE_NORM
-               math_add_gramian(perturbation_matrix, FEATURE_PASSES, features, 
1.0f);
+               math_add_gramian(perturbation_matrix, FEATURE_PASSES, features, 
kernel_data.integrator.filter_strength);
 #else
                for(int i = 0; i < FEATURE_PASSES; i++)
-                       feature_matrix_norm += features[i];
+                       feature_matrix_norm += 
features[i]*kernel_data.integrator.filter_strength;
 #endif
        } END_FOR_PIXEL_WINDOW
        math_lower_tri_to_full(feature_matrix, DENOISE_FEATURES);
diff --git a/intern/cycles/kernel/kernel_types.h 
b/intern/cycles/kernel/kernel_types.h
index b03a1d9..ddc6b41 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1144,6 +1144,7 @@ typedef struct KernelIntegrator {
 
        /* denoiser */
        int half_window;
+       float filter_strength;
 } KernelIntegrator;
 
 typedef struct KernelBVH {
diff --git a/intern/cycles/render/integrator.cpp 
b/intern/cycles/render/integrator.cpp
index 8eb3f2e..117c51a 100644
--- a/intern/cycles/render/integrator.cpp
+++ b/intern/cycles/render/integrator.cpp
@@ -77,6 +77,7 @@ NODE_DEFINE(Integrator)
        SOCKET_ENUM(sampling_pattern, "Sampling Pattern", 
sampling_pattern_enum, SAMPLING_PATTERN_SOBOL);
 
        SOCKET_INT(half_window, "Half Window", 8);
+       SOCKET_FLOAT(filter_strength, "Filter Strength", 0.0f);
 
        return type;
 }
@@ -198,6 +199,7 @@ void Integrator::device_update(Device *device, DeviceScene 
*dscene, Scene *scene
        }
 
        kintegrator->half_window = half_window;
+       kintegrator->filter_strength = filter_strength;
 
        need_update = false;
 }
diff --git a/intern/cycles/render/integrator.h 
b/intern/cycles/render/integrator.h
index 72abb85..9018f2a 100644
--- a/intern/cycles/render/integrator.h
+++ b/intern/cycles/render/integrator.h
@@ -81,6 +81,7 @@ public:
        bool need_update;
 
        int half_window;
+       float filter_strength;
 
        Integrator();
        ~Integrator();
diff --git a/source/blender/makesrna/intern/rna_scene.c 
b/source/blender/makesrna/intern/rna_scene.c
index a89bc8a..ec91e02 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -4645,14 +4645,14 @@ static void rna_def_scene_render_layer(BlenderRNA *brna)
 
        prop = RNA_def_property(srna, "filter_strength", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "denoise_strength");
-       RNA_def_property_range(prop, -2.0, 2.0);
-       RNA_def_property_ui_text(prop, "Filter strength", "Strength of the 
denoising filter (0 = average, higher is stronger)");
+       RNA_def_property_range(prop, -4.0f, 4.0f);
+       RNA_def_property_ui_text(prop, "Filter strength", "Controls feature 
variance weight for the denoising filter (lower values preserve more detail, 
but aren't as smooth)");
        RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
 
        prop = RNA_def_property(srna, "half_window", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "denoise_half_window");
        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_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);
 }

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

Reply via email to