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