[Bf-blender-cvs] [7631c83c5f] temp-cycles-denoising: Cycles Denoising: Fix NaN results in a few scenes

Lukas Stockner noreply at git.blender.org
Fri Mar 24 20:18:20 CET 2017


Commit: 7631c83c5f95dfa5887f28bf2aee74c6ec43735d
Author: Lukas Stockner
Date:   Mon Mar 13 22:59:13 2017 +0100
Branches: temp-cycles-denoising
https://developer.blender.org/rB7631c83c5f95dfa5887f28bf2aee74c6ec43735d

Cycles Denoising: Fix NaN results in a few scenes

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

M	intern/cycles/kernel/kernel_passes.h
M	intern/cycles/util/util_math.h

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

diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index a3f39646bd..d4e648429c 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -16,20 +16,6 @@
 
 CCL_NAMESPACE_BEGIN
 
-ccl_device_inline float3 ensure_finite3(float3 a)
-{
-	if(!isfinite(a.x)) a.x = 0.0f;
-	if(!isfinite(a.y)) a.y = 0.0f;
-	if(!isfinite(a.z)) a.z = 0.0f;
-	return a;
-}
-
-ccl_device_inline float ensure_finite(float a)
-{
-	if(!isfinite(a)) return 0.0f;
-	return a;
-}
-
 ccl_device_inline void kernel_write_pass_float(ccl_global float *buffer, int sample, float value)
 {
 	ccl_global float *buf = buffer;
@@ -154,7 +140,7 @@ ccl_device_inline void kernel_update_denoising_features(KernelGlobals *kg,
 		return;
 	}
 
-	L->denoising_depth += state->denoising_feature_weight * sd->ray_length;
+	L->denoising_depth += ensure_finite(state->denoising_feature_weight * sd->ray_length);
 
 	float3 normal = make_float3(0.0f, 0.0f, 0.0f);
 	float3 albedo = make_float3(0.0f, 0.0f, 0.0f);
@@ -187,8 +173,11 @@ ccl_device_inline void kernel_update_denoising_features(KernelGlobals *kg,
 
 	/* Wait for next bounce if 75% or more sample weight belongs to specular-like closures. */
 	if((sum_weight == 0.0f) || (sum_nonspecular_weight*4.0f > sum_weight)) {
-		L->denoising_normal += state->denoising_feature_weight * ensure_finite3(normal/sum_weight);
-		L->denoising_albedo += state->denoising_feature_weight * ensure_finite3(albedo);
+		if(sum_weight != 0.0f) {
+			normal /= sum_weight;
+		}
+		L->denoising_normal += ensure_finite3(state->denoising_feature_weight * normal);
+		L->denoising_albedo += ensure_finite3(state->denoising_feature_weight * albedo);
 
 		state->denoising_feature_weight = 0.0f;
 		if(!(state->flag & PATH_RAY_SHADOW_CATCHER)) {
diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h
index 3423b94ef1..da4bc53778 100644
--- a/intern/cycles/util/util_math.h
+++ b/intern/cycles/util/util_math.h
@@ -1716,6 +1716,31 @@ ccl_device_inline int util_max_axis(float3 vec)
 #endif
 }
 
+/* An implementation of isfinite that works in combination with -ffast-math.
+ * In IEEE 754 floats, bits 24 to 31 store the exponent, and an exponent of 0xff means either inf or nan. */
+ccl_device_inline float safe_isfinite(float v)
+{
+	union {
+		int i;
+		float v;
+	} u;
+	u.v = v;
+	return (u.i & 0x7f800000) != 0x7f800000;
+}
+
+ccl_device_inline float ensure_finite(float v)
+{
+	return safe_isfinite(v)? v : 0.0f;
+};
+
+ccl_device_inline float3 ensure_finite3(float3 v)
+{
+	if(!safe_isfinite(v.x)) v.x = 0.0;
+	if(!safe_isfinite(v.y)) v.y = 0.0;
+	if(!safe_isfinite(v.z)) v.z = 0.0;
+	return v;
+}
+
 CCL_NAMESPACE_END
 
 #endif /* __UTIL_MATH_H__ */




More information about the Bf-blender-cvs mailing list