Commit: 79ce8c2d685ba7314d88a14430a3c2bd59812a20
Author: Lukas Stockner
Date:   Mon Nov 14 12:53:48 2016 +0100
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB79ce8c2d685ba7314d88a14430a3c2bd59812a20

Cycles: Support denoising weighting adjustment

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

M       intern/cycles/blender/addon/ui.py
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/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 40b70c6..093340d 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -577,6 +577,7 @@ class CyclesRender_PT_denoising(CyclesButtonsPanel, Panel):
         sub = col.column(align=True)
         sub.prop(rl, "half_window")
         sub.prop(rl, "filter_strength", slider=True)
+        sub.prop(rl, "filter_weighting_adjust", slider=True)
 
         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 c585f48..edb18bf 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -465,6 +465,7 @@ void BlenderSession::render()
                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->integrator->weighting_adjust = powf(2.0f, 
b_layer_iter->filter_weighting_adjust());
 
                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 29a0742..990b419 100644
--- a/intern/cycles/kernel/kernel_filter.h
+++ b/intern/cycles/kernel/kernel_filter.h
@@ -338,7 +338,7 @@ ccl_device void kernel_filter_final_pass_wlr(KernelGlobals 
*kg, int sample, floa
                        global_bandwidths[j+1] = global_bandwidths[j];
                global_bandwidths[j+1] = v;
        }
-       float global_bandwidth = global_bandwidths[sort_idx/2];
+       float global_bandwidth = global_bandwidths[sort_idx/2] * 
kernel_data.integrator.weighting_adjust;
 
        float bandwidth_factor[DENOISE_FEATURES];
        for(int i = 0; i < rank; i++) {
@@ -482,7 +482,7 @@ ccl_device void kernel_filter_final_pass_nlm(KernelGlobals 
*kg, int sample, floa
                filter_get_features(px, py, pt, pixel_buffer, features, 
feature_means, pass_stride);
                filter_fill_design_row_no_weight_cuda(features, rank, 
design_row, transform, transform_stride);
 
-               float weight = nlm_weight(x, y, px, py, center_buffer, 
pixel_buffer, pass_stride, 1.0f, 0.5f, 4, rect);
+               float weight = nlm_weight(x, y, px, py, center_buffer, 
pixel_buffer, pass_stride, 1.0f, kernel_data.integrator.weighting_adjust, 4, 
rect);
                if(weight == 0.0f) continue;
                weight /= max(1.0f, variance);
 
@@ -515,7 +515,7 @@ ccl_device void kernel_filter_final_pass_nlm(KernelGlobals 
*kg, int sample, floa
                filter_get_features(px, py, pt, pixel_buffer, features, 
feature_means, pass_stride);
                filter_fill_design_row_no_weight_cuda(features, rank, 
design_row, transform, transform_stride);
 
-               float weight = nlm_weight(x, y, px, py, center_buffer, 
pixel_buffer, pass_stride, 1.0f, 0.5f, 4, rect);
+               float weight = nlm_weight(x, y, px, py, center_buffer, 
pixel_buffer, pass_stride, 1.0f, kernel_data.integrator.weighting_adjust, 4, 
rect);
                if(weight == 0.0f) continue;
                weight /= max(1.0f, variance);
                weight *= math_dot(design_row, r_feature_weight, matrix_size);
@@ -1182,7 +1182,7 @@ ccl_device void 
kernel_filter_final_pass_wlr(KernelGlobals *kg, int sample, floa
                        global_bandwidths[j+1] = global_bandwidths[j];
                global_bandwidths[j+1] = v;
        }
-       float global_bandwidth = global_bandwidths[sort_idx/2];
+       float global_bandwidth = global_bandwidths[sort_idx/2] * 
kernel_data.integrator.weighting_adjust;
 
 
 
@@ -1331,7 +1331,7 @@ ccl_device void 
kernel_filter_final_pass_nlm(KernelGlobals *kg, int sample, floa
                filter_get_features(px, py, pt, pixel_buffer, features, 
feature_means, pass_stride);
                filter_fill_design_row_no_weight(features, rank, design_row, 
feature_transform);
 
-               float weight = nlm_weight(x, y, px, py, center_buffer, 
pixel_buffer, pass_stride, 1.0f, 0.5f, 4, rect);
+               float weight = nlm_weight(x, y, px, py, center_buffer, 
pixel_buffer, pass_stride, 1.0f, kernel_data.integrator.weighting_adjust, 4, 
rect);
                if(weight < 1e-5f) continue;
                weight /= max(1.0f, variance);
 
@@ -1364,7 +1364,7 @@ ccl_device void 
kernel_filter_final_pass_nlm(KernelGlobals *kg, int sample, floa
                filter_get_features(px, py, pt, pixel_buffer, features, 
feature_means, pass_stride);
                filter_fill_design_row_no_weight(features, rank, design_row, 
feature_transform);
 
-               float weight = nlm_weight(x, y, px, py, center_buffer, 
pixel_buffer, pass_stride, 1.0f, 0.5f, 4, rect);
+               float weight = nlm_weight(x, y, px, py, center_buffer, 
pixel_buffer, pass_stride, 1.0f, kernel_data.integrator.weighting_adjust, 4, 
rect);
                if(weight < 1e-5f) continue;
                weight /= max(1.0f, variance);
                weight *= math_dot(design_row, r_feature_weight, matrix_size);
diff --git a/intern/cycles/kernel/kernel_types.h 
b/intern/cycles/kernel/kernel_types.h
index f2cffd4..aef0133 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1162,8 +1162,9 @@ typedef struct KernelIntegrator {
        /* denoiser */
        int half_window;
        float filter_strength;
+       float weighting_adjust;
 
-       int pad1, pad2, pad3;
+       int pad1, pad2;
 } KernelIntegrator;
 static_assert_align(KernelIntegrator, 16);
 
diff --git a/intern/cycles/render/integrator.cpp 
b/intern/cycles/render/integrator.cpp
index 52dac16..efff46c 100644
--- a/intern/cycles/render/integrator.cpp
+++ b/intern/cycles/render/integrator.cpp
@@ -79,6 +79,7 @@ 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);
 
        return type;
 }
@@ -208,6 +209,7 @@ 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;
 
        need_update = false;
 }
diff --git a/intern/cycles/render/integrator.h 
b/intern/cycles/render/integrator.h
index 0456008..7561dbd 100644
--- a/intern/cycles/render/integrator.h
+++ b/intern/cycles/render/integrator.h
@@ -84,6 +84,7 @@ public:
 
        int half_window;
        float filter_strength;
+       float weighting_adjust;
 
        Integrator();
        ~Integrator();
diff --git a/source/blender/makesdna/DNA_scene_types.h 
b/source/blender/makesdna/DNA_scene_types.h
index 80d7bff..103c4d1 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -230,7 +230,7 @@ typedef struct SceneRenderLayer {
        int denoiseflag;
        int denoise_half_window;
        float denoise_strength;
-       int pad;
+       float denoise_weighting;
 
        int samples;
        float pass_alpha_threshold;
diff --git a/source/blender/makesrna/intern/rna_scene.c 
b/source/blender/makesrna/intern/rna_scene.c
index 5db8c6c..0d272d1 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -5007,6 +5007,12 @@ static void rna_def_scene_render_layer(BlenderRNA *brna)
        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, "filter_weighting_adjust", PROP_FLOAT, 
PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "denoise_weighting");
+       RNA_def_property_range(prop, -4.0f, 4.0f);
+       RNA_def_property_ui_text(prop, "Filter weighting adjust", "Controls 
neighbor pixel weighting 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);

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

Reply via email to