[Bf-blender-cvs] [a090544] soc-2016-cycles_denoising: Cycles: Add experimental second-order fitting for denoising, disabled for now

Lukas Stockner noreply at git.blender.org
Sun Jun 19 18:22:03 CEST 2016


Commit: a090544336c91676375f1522eea2599a95a22f8f
Author: Lukas Stockner
Date:   Sun Jun 19 18:02:26 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBa090544336c91676375f1522eea2599a95a22f8f

Cycles: Add experimental second-order fitting for denoising, disabled for now

This change can help a lot with shadow edges, but adds artifacts to smoother areas.
In the future, I'll look into adaptively selecting the polynomial order.

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

M	intern/cycles/kernel/kernel_filter.h
M	intern/cycles/kernel/kernel_types.h

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

diff --git a/intern/cycles/kernel/kernel_filter.h b/intern/cycles/kernel/kernel_filter.h
index 597da52..4971f0d 100644
--- a/intern/cycles/kernel/kernel_filter.h
+++ b/intern/cycles/kernel/kernel_filter.h
@@ -45,6 +45,11 @@ ccl_device_inline void filter_get_features(int x, int y, float *buffer, float sa
 		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];
+#endif
 }
 
 ccl_device_inline void filter_get_feature_variance(int x, int y, float *buffer, float sample, float *features, float *scale)
@@ -60,6 +65,11 @@ ccl_device_inline void filter_get_feature_variance(int x, int y, float *buffer,
 	features[6] = saturate(buffer[13] * sample_scale_var) * sample_scale;
 	features[7] = 0.0f;
 	features[8] = 0.0f;
+#ifdef DENOISE_SECOND_ORDER_SCREEN
+	features[9] = 0.0f;
+	features[10] = 0.0f;
+	features[11] = 0.0f;
+#endif
 	for(int i = 0; i < DENOISE_FEATURES; i++)
 		features[i] *= scale[i]*scale[i];
 }
@@ -165,6 +175,9 @@ ccl_device void kernel_filter_estimate_params(KernelGlobals *kg, int sample, flo
 	for(int i = 0; i < FEATURE_PASSES; 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
 
 
 
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 21d1671..73c813d 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1270,7 +1270,14 @@ enum RayState {
 #define REMOVE_RAY_FLAG(ray_state, ray_index, flag) (ray_state[ray_index] = (ray_state[ray_index] & (~flag)))
 #define IS_FLAG(ray_state, ray_index, flag) (ray_state[ray_index] & flag)
 
+/* Enabling second-order screen features will preserve shadow edges better, but currently may cause artifacts in smooth areas. */
+#undef DENOISE_SECOND_ORDER_SCREEN
+
+#ifdef DENOISE_SECOND_ORDER_SCREEN
+#define DENOISE_FEATURES 12 /* The amount of denoising features: Normal, Albedo, Depth and screen position (x, y, x^2, y^2, x*y) */
+#else
 #define DENOISE_FEATURES 9 /* The amount of denoising features: Normal, Albedo, Depth and screen position (x, y)*/
+#endif
 
 typedef struct FilterStorage {
 	float transform[DENOISE_FEATURES*DENOISE_FEATURES];




More information about the Bf-blender-cvs mailing list