[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