[Bf-blender-cvs] [da1d462] soc-2016-cycles_denoising: Cycles: Replace NaNs in the feature passes with zero

Lukas Stockner noreply at git.blender.org
Sat Aug 6 05:41:03 CEST 2016


Commit: da1d462467369e7b9f16edcc2e8d82c5d0eadbe2
Author: Lukas Stockner
Date:   Thu Jul 28 04:14:13 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBda1d462467369e7b9f16edcc2e8d82c5d0eadbe2

Cycles: Replace NaNs in the feature passes with zero

As soon as any feature pass sample is NaN, every pixel which contains that sample in its filter window will be black in the filtered result.
Ideally no NaNs should be generated in the first place, but there are quite a few cases where they are generated in Cycles and now become visible.
So, as a temporary fix, NaNs are now replaced with zero when storing the passes. Ideally these NaNs should be fixed for good, of course.

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

M	intern/cycles/kernel/closure/bsdf_microfacet.h
M	intern/cycles/kernel/kernel_passes.h

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

diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index e7ec183..183c21b 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -146,7 +146,7 @@ ccl_device_inline void microfacet_ggx_sample_slopes(
 	/* sample slope_x */
 	const float A = 2.0f*randu*G1_inv - 1.0f;
 	const float AA = A*A;
-	const float tmp = 1.0f/(AA - 1.0f);
+	const float tmp = 1.0f/max(AA - 1.0f, 1e-7f);
 	const float B = tan_theta_i;
 	const float BB = B*B;
 	const float D = safe_sqrtf(BB*(tmp*tmp) - (AA - BB)*tmp);
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index 252c45b..39642a6 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -16,6 +16,20 @@
 
 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;
@@ -177,9 +191,9 @@ ccl_device_inline bool kernel_write_denoising_passes(KernelGlobals *kg, ccl_glob
 				/* This bounce is almost specular, so don't write the data yet. */
 				return false;
 			}
-			kernel_write_pass_float3_var(buffer, sample, normal/sum_weight);
-			kernel_write_pass_float3_var(buffer + 6, sample, albedo);
-			kernel_write_pass_float_var(buffer + 12, sample, state->path_length);
+			kernel_write_pass_float3_var(buffer, sample, ensure_finite3(normal/sum_weight));
+			kernel_write_pass_float3_var(buffer + 6, sample, ensure_finite3(albedo));
+			kernel_write_pass_float_var(buffer + 12, sample, ensure_finite(state->path_length));
 		}
 	}
 	else {




More information about the Bf-blender-cvs mailing list