[Bf-blender-cvs] [b5c7734] soc-2016-cycles_denoising: Cycles: Implement the Filter Weight functionality
Lukas Stockner
noreply at git.blender.org
Sat Aug 6 05:41:07 CEST 2016
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);
}
More information about the Bf-blender-cvs
mailing list