[Bf-blender-cvs] [d23f000] soc-2016-cycles_denoising: Cycles: Fix denoising feature matrix norm calculation

Lukas Stockner noreply at git.blender.org
Wed Aug 10 03:22:16 CEST 2016


Commit: d23f00039f1e953ed5ca0dac3ceccc07230e7170
Author: Lukas Stockner
Date:   Tue Aug 9 02:22:59 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBd23f00039f1e953ed5ca0dac3ceccc07230e7170

Cycles: Fix denoising feature matrix norm calculation

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

M	intern/cycles/kernel/kernel_filter.h

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

diff --git a/intern/cycles/kernel/kernel_filter.h b/intern/cycles/kernel/kernel_filter.h
index bb9fa26..1dc4387 100644
--- a/intern/cycles/kernel/kernel_filter.h
+++ b/intern/cycles/kernel/kernel_filter.h
@@ -18,6 +18,10 @@
 
 CCL_NAMESPACE_BEGIN
 
+/* Not all features are included in the matrix norm. */
+#define NORM_FEATURE_OFFSET 2
+#define NORM_FEATURE_NUM 8
+
 #define ccl_get_feature(pass) buffer[(pass)*pass_stride]
 
 #define FOR_PIXEL_WINDOW     pixel_buffer = buffer + (low.y - rect.y)*buffer_w + (low.x - rect.x); \
@@ -304,7 +308,7 @@ ccl_device void kernel_filter_estimate_params(KernelGlobals *kg, int sample, flo
 	math_matrix_zero_lower(feature_matrix, DENOISE_FEATURES);
 #ifdef FULL_EIGENVALUE_NORM
 	float *perturbation_matrix = tempmatrix + DENOISE_FEATURES*DENOISE_FEATURES;
-	math_matrix_zero_lower(perturbation_matrix, FEATURE_PASSES);
+	math_matrix_zero_lower(perturbation_matrix, NORM_FEATURE_NUM);
 #endif
 	FOR_PIXEL_WINDOW {
 		filter_get_features(px, py, pixel_buffer, features, feature_means, pass_stride);
@@ -314,10 +318,10 @@ ccl_device void kernel_filter_estimate_params(KernelGlobals *kg, int sample, flo
 
 		filter_get_feature_variance(px, py, pixel_buffer, features, feature_scale, pass_stride);
 #ifdef FULL_EIGENVALUE_NORM
-		math_add_gramian(perturbation_matrix, FEATURE_PASSES, features, kernel_data.integrator.filter_strength);
+		math_add_gramian(perturbation_matrix, NORM_FEATURE_NUM, features, kernel_data.integrator.filter_strength);
 #else
-		for(int i = 0; i < FEATURE_PASSES; i++)
-			feature_matrix_norm += features[i]*kernel_data.integrator.filter_strength;
+		for(int i = 0; i < NORM_FEATURE_NUM; i++)
+			feature_matrix_norm += features[i + NORM_FEATURE_OFFSET]*kernel_data.integrator.filter_strength;
 #endif
 	} END_FOR_PIXEL_WINDOW
 	math_lower_tri_to_full(feature_matrix, DENOISE_FEATURES);
@@ -329,7 +333,7 @@ ccl_device void kernel_filter_estimate_params(KernelGlobals *kg, int sample, flo
 	float *eigenvector_guess = tempvector + 2*DENOISE_FEATURES;
 	for(int i = 0; i < DENOISE_FEATURES; i++)
 		eigenvector_guess[i] = 1.0f;
-	float singular_threshold = 0.01f + 2.0f * sqrtf(math_largest_eigenvalue(perturbation_matrix, FEATURE_PASSES, eigenvector_guess, tempvector + 3*DENOISE_FEATURES));
+	float singular_threshold = 0.01f + 2.0f * sqrtf(math_largest_eigenvalue(perturbation_matrix, NORM_FEATURE_NUM, eigenvector_guess, tempvector + 3*DENOISE_FEATURES));
 #else
 	float singular_threshold = 0.01f + 2.0f * (sqrtf(feature_matrix_norm) / (sqrtf(rank) * 0.5f));
 #endif




More information about the Bf-blender-cvs mailing list