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];

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to