[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