[Bf-blender-cvs] [7470312] soc-2016-cycles_denoising: Cycles: Tweak order of denoising feature vector to improve quality of results

Lukas Stockner noreply at git.blender.org
Sun Jul 24 03:46:04 CEST 2016


Commit: 747031222b266da48f9e482a580818ea90e1a9e9
Author: Lukas Stockner
Date:   Sun Jul 24 02:12:41 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB747031222b266da48f9e482a580818ea90e1a9e9

Cycles: Tweak order of denoising feature vector to improve quality of results

This commit reorders the denoising features: Instead of "Normals, Texture, Depth, Screen position"
the order now is "Screen position, Depth, Normals, Texture" like in the old demo code, which significantly
improves result quality.

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

M	intern/cycles/kernel/kernel_filter.h

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

diff --git a/intern/cycles/kernel/kernel_filter.h b/intern/cycles/kernel/kernel_filter.h
index ad3d256..01e5f76 100644
--- a/intern/cycles/kernel/kernel_filter.h
+++ b/intern/cycles/kernel/kernel_filter.h
@@ -32,23 +32,23 @@ CCL_NAMESPACE_BEGIN
 ccl_device_inline void filter_get_features(int x, int y, float *buffer, float sample, float *features, float *mean)
 {
 	float sample_scale = 1.0f/sample;
-	features[0] = buffer[0] * sample_scale;
-	features[1] = buffer[1] * sample_scale;
-	features[2] = buffer[2] * sample_scale;
-	features[3] = buffer[6] * sample_scale;
-	features[4] = buffer[7] * sample_scale;
-	features[5] = buffer[8] * sample_scale;
-	features[6] = buffer[12] * sample_scale;
-	features[7] = x;
-	features[8] = y;
+	features[0] = x;
+	features[1] = y;
+	features[2] = buffer[12] * sample_scale;
+	features[3] = buffer[0] * sample_scale;
+	features[4] = buffer[1] * sample_scale;
+	features[5] = buffer[2] * sample_scale;
+	features[6] = buffer[6] * sample_scale;
+	features[7] = buffer[7] * sample_scale;
+	features[8] = buffer[8] * sample_scale;
 	if(mean) {
 		for(int i = 0; i < DENOISE_FEATURES; i++)
 			features[i] -= mean[i];
 	}
 #ifdef DENOISE_SECOND_ORDER_SCREEN
-	features[9] = features[7]*features[7];
-	features[10] = features[8]*features[8];
-	features[11] = features[7]*features[8];
+	features[9] = features[0]*features[0];
+	features[10] = features[1]*features[1];
+	features[11] = features[0]*features[1];
 #endif
 }
 
@@ -56,15 +56,15 @@ ccl_device_inline void filter_get_feature_variance(int x, int y, float *buffer,
 {
 	float sample_scale = 1.0f/sample;
 	float sample_scale_var = 1.0f/(sample - 1.0f);
-	features[0] = saturate(buffer[3] * sample_scale_var) * sample_scale;
-	features[1] = saturate(buffer[4] * sample_scale_var) * sample_scale;
-	features[2] = saturate(buffer[5] * sample_scale_var) * sample_scale;
-	features[3] = saturate(buffer[9] * sample_scale_var) * sample_scale;
-	features[4] = saturate(buffer[10] * sample_scale_var) * sample_scale;
-	features[5] = saturate(buffer[11] * sample_scale_var) * sample_scale;
-	features[6] = saturate(buffer[13] * sample_scale_var) * sample_scale;
-	features[7] = 0.0f;
-	features[8] = 0.0f;
+	features[0] = 0.0f;
+	features[1] = 0.0f;
+	features[2] = saturate(buffer[13] * sample_scale_var) * sample_scale;
+	features[3] = saturate(buffer[3] * sample_scale_var) * sample_scale;
+	features[4] = saturate(buffer[4] * sample_scale_var) * sample_scale;
+	features[5] = saturate(buffer[5] * sample_scale_var) * sample_scale;
+	features[6] = saturate(buffer[9] * sample_scale_var) * sample_scale;
+	features[7] = saturate(buffer[10] * sample_scale_var) * sample_scale;
+	features[8] = saturate(buffer[11] * sample_scale_var) * sample_scale;
 #ifdef DENOISE_SECOND_ORDER_SCREEN
 	features[9] = 0.0f;
 	features[10] = 0.0f;
@@ -152,15 +152,13 @@ ccl_device void kernel_filter_estimate_params(KernelGlobals *kg, int sample, flo
 	float feature_means[DENOISE_FEATURES] = {0.0f};
 	FOR_PIXEL_WINDOW {
 		filter_get_features(px, py, buffer, sample, features, NULL);
-		for(int i = 0; i < FEATURE_PASSES; i++)
+		for(int i = 0; i < DENOISE_FEATURES; i++)
 			feature_means[i] += features[i];
 	} END_FOR_PIXEL_WINDOW
 
 	float pixel_scale = 1.0f / ((high.y - low.y) * (high.x - low.x));
-	for(int i = 0; i < FEATURE_PASSES; i++)
+	for(int i = 0; i < DENOISE_FEATURES; i++)
 		feature_means[i] *= pixel_scale;
-	feature_means[7] = x;
-	feature_means[8] = y;
 
 	/* === Scale the shifted feature passes to a range of [-1; 1], will be baked into the transform later. === */
 	float *feature_scale = tempvector;
@@ -168,16 +166,12 @@ ccl_device void kernel_filter_estimate_params(KernelGlobals *kg, int sample, flo
 
 	FOR_PIXEL_WINDOW {
 		filter_get_features(px, py, buffer, sample, features, feature_means);
-		for(int i = 0; i < FEATURE_PASSES; i++)
+		for(int i = 0; i < DENOISE_FEATURES; i++)
 			feature_scale[i] = max(feature_scale[i], fabsf(features[i]));
 	} END_FOR_PIXEL_WINDOW
 
-	for(int i = 0; i < FEATURE_PASSES; i++)
+	for(int i = 0; i < DENOISE_FEATURES; i++)
 		feature_scale[i] = 1.0f / max(feature_scale[i], 0.01f);
-	feature_scale[7] = feature_scale[8] = 1.0f / kernel_data.integrator.half_window;
-#ifdef DENOISE_SECOND_ORDER_SCREEN
-	feature_scale[9] = feature_scale[10] = feature_scale[11] = 1.0f / (kernel_data.integrator.half_window*kernel_data.integrator.half_window);
-#endif
 
 
 
@@ -189,17 +183,17 @@ 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, DENOISE_FEATURES);
+	math_matrix_zero_lower(perturbation_matrix, FEATURE_PASSES);
 #endif
 	FOR_PIXEL_WINDOW {
 		filter_get_features(px, py, buffer, sample, features, feature_means);
-		for(int i = 0; i < FEATURE_PASSES; i++)
+		for(int i = 0; i < DENOISE_FEATURES; i++)
 			features[i] *= feature_scale[i];
 		math_add_gramian(feature_matrix, DENOISE_FEATURES, features, 1.0f);
 
 		filter_get_feature_variance(px, py, buffer, sample, features, feature_scale);
 #ifdef FULL_EIGENVALUE_NORM
-		math_add_gramian(perturbation_matrix, DENOISE_FEATURES, features, 1.0f);
+		math_add_gramian(perturbation_matrix, FEATURE_PASSES, features, 1.0f);
 #else
 		for(int i = 0; i < FEATURE_PASSES; i++)
 			feature_matrix_norm += features[i];
@@ -214,7 +208,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, DENOISE_FEATURES, eigenvector_guess, tempvector + 3*DENOISE_FEATURES));
+	float singular_threshold = 0.01f + 2.0f * sqrtf(math_largest_eigenvalue(perturbation_matrix, FEATURE_PASSES, 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