[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