[Bf-blender-cvs] [ec831ee7d1e] master: Fix Cycles denoising NaNs with a 1 sample renders.

Brecht Van Lommel noreply at git.blender.org
Sun Jul 23 00:49:19 CEST 2017


Commit: ec831ee7d1efc4a9f48e89861fe0375f1c4bd4d6
Author: Brecht Van Lommel
Date:   Fri Jul 21 21:43:49 2017 +0200
Branches: master
https://developer.blender.org/rBec831ee7d1efc4a9f48e89861fe0375f1c4bd4d6

Fix Cycles denoising NaNs with a 1 sample renders.

This was causing different render results with different compilers. We
can't do much useful with 1 sample, but better for debugging.

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

M	intern/cycles/kernel/filter/filter_prefilter.h

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

diff --git a/intern/cycles/kernel/filter/filter_prefilter.h b/intern/cycles/kernel/filter/filter_prefilter.h
index d5ae1b73927..a0b89c1111f 100644
--- a/intern/cycles/kernel/filter/filter_prefilter.h
+++ b/intern/cycles/kernel/filter/filter_prefilter.h
@@ -61,8 +61,8 @@ ccl_device void kernel_filter_divide_shadow(int sample,
 		varA = max(0.0f, varA - unfilteredA[idx]*unfilteredA[idx]*odd_sample);
 		varB = max(0.0f, varB - unfilteredB[idx]*unfilteredB[idx]*even_sample);
 	}
-	varA /= (odd_sample - 1);
-	varB /= (even_sample - 1);
+	varA /= max(odd_sample - 1, 1);
+	varB /= max(even_sample - 1, 1);
 
 	sampleVariance[idx]  = 0.5f*(varA + varB) / sample;
 	sampleVarianceV[idx] = 0.5f * (varA - varB) * (varA - varB) / (sample*sample);
@@ -96,11 +96,17 @@ ccl_device void kernel_filter_get_feature(int sample,
 	int idx = (y-rect.y)*buffer_w + (x - rect.x);
 
 	mean[idx] = center_buffer[m_offset] / sample;
-	if(use_split_variance) {
-		variance[idx] = max(0.0f, (center_buffer[v_offset] - mean[idx]*mean[idx]*sample) / (sample * (sample-1)));
+	if (sample > 1) {
+		if(use_split_variance) {
+			variance[idx] = max(0.0f, (center_buffer[v_offset] - mean[idx]*mean[idx]*sample) / (sample * (sample-1)));
+		}
+		else {
+			variance[idx] = center_buffer[v_offset] / (sample * (sample-1));
+		}
 	}
 	else {
-		variance[idx] = center_buffer[v_offset] / (sample * (sample-1));
+		/* Can't compute variance with single sample, just set it very high. */
+		variance[idx] = 1e10f;
 	}
 }




More information about the Bf-blender-cvs mailing list