[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53689] trunk/blender/intern/cycles/kernel : Cycles: different fix for perlin noise generating nan values, now check for

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Jan 9 23:06:04 CET 2013


Revision: 53689
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53689
Author:   blendix
Date:     2013-01-09 22:06:03 +0000 (Wed, 09 Jan 2013)
Log Message:
-----------
Cycles: different fix for perlin noise generating nan values, now check for
the result to be finite afterwards which is a bit faster and works for OSL
too without needing to slow down OSL itself.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/kernel_path.h
    trunk/blender/intern/cycles/kernel/shaders/node_musgrave_texture.osl
    trunk/blender/intern/cycles/kernel/shaders/node_texture.h
    trunk/blender/intern/cycles/kernel/svm/svm_noise.h

Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_path.h	2013-01-09 21:09:20 UTC (rev 53688)
+++ trunk/blender/intern/cycles/kernel/kernel_path.h	2013-01-09 22:06:03 UTC (rev 53689)
@@ -238,7 +238,9 @@
 
 	float min_ray_pdf = FLT_MAX;
 	float ray_pdf = 0.0f;
+#ifdef __LAMP_MIS__
 	float ray_t = 0.0f;
+#endif
 	PathState state;
 	int rng_offset = PRNG_BASE_NUM;
 
@@ -446,7 +448,9 @@
 		/* set labels */
 		if(!(label & LABEL_TRANSPARENT)) {
 			ray_pdf = bsdf_pdf;
+#ifdef __LAMP_MIS__
 			ray_t = 0.0f;
+#endif
 			min_ray_pdf = fminf(bsdf_pdf, min_ray_pdf);
 		}
 
@@ -484,7 +488,9 @@
 __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray ray, __global float *buffer,
 	float3 throughput, float min_ray_pdf, float ray_pdf, PathState state, int rng_offset, PathRadiance *L)
 {
+#ifdef __LAMP_MIS__
 	float ray_t = 0.0f;
+#endif
 
 	/* path iteration */
 	for(;; rng_offset += PRNG_BOUNCE_NUM) {
@@ -655,7 +661,9 @@
 		/* set labels */
 		if(!(label & LABEL_TRANSPARENT)) {
 			ray_pdf = bsdf_pdf;
+#ifdef __LAMP_MIS__
 			ray_t = 0.0f;
+#endif
 			min_ray_pdf = fminf(bsdf_pdf, min_ray_pdf);
 		}
 

Modified: trunk/blender/intern/cycles/kernel/shaders/node_musgrave_texture.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/shaders/node_musgrave_texture.osl	2013-01-09 21:09:20 UTC (rev 53688)
+++ trunk/blender/intern/cycles/kernel/shaders/node_musgrave_texture.osl	2013-01-09 22:06:03 UTC (rev 53689)
@@ -37,14 +37,14 @@
 	int i;
 
 	for (i = 0; i < (int)octaves; i++) {
-		value += noise("perlin", p) * pwr;
+		value += safe_noise(p) * pwr;
 		pwr *= pwHL;
 		p *= lacunarity;
 	}
 
 	rmd = octaves - floor(octaves);
 	if (rmd != 0.0)
-		value += rmd * noise("perlin", p) * pwr;
+		value += rmd * safe_noise(p) * pwr;
 
 	return value;
 }
@@ -65,14 +65,14 @@
 	int i;
 
 	for (i = 0; i < (int)octaves; i++) {
-		value *= (pwr * noise("perlin", p) + 1.0);
+		value *= (pwr * safe_noise(p) + 1.0);
 		pwr *= pwHL;
 		p *= lacunarity;
 	}
 
 	rmd = octaves - floor(octaves);
 	if (rmd != 0.0)
-		value *= (rmd * pwr * noise("perlin", p) + 1.0); /* correct? */
+		value *= (rmd * pwr * safe_noise(p) + 1.0); /* correct? */
 
 	return value;
 }
@@ -93,11 +93,11 @@
 	int i;
 
 	/* first unscaled octave of function; later octaves are scaled */
-	value = offset + noise("perlin", p);
+	value = offset + safe_noise(p);
 	p *= lacunarity;
 
 	for (i = 1; i < (int)octaves; i++) {
-		increment = (noise("perlin", p) + offset) * pwr * value;
+		increment = (safe_noise(p) + offset) * pwr * value;
 		value += increment;
 		pwr *= pwHL;
 		p *= lacunarity;
@@ -105,7 +105,7 @@
 
 	rmd = octaves - floor(octaves);
 	if (rmd != 0.0) {
-		increment = (noise("perlin", p) + offset) * pwr * value;
+		increment = (safe_noise(p) + offset) * pwr * value;
 		value += rmd * increment;
 	}
 
@@ -128,7 +128,7 @@
 	float pwr = pwHL;
 	int i;
 
-	result = noise("perlin", p) + offset;
+	result = safe_noise(p) + offset;
 	weight = gain * result;
 	p *= lacunarity;
 
@@ -136,7 +136,7 @@
 		if (weight > 1.0)
 			weight = 1.0;
 
-		signal = (noise("perlin", p) + offset) * pwr;
+		signal = (safe_noise(p) + offset) * pwr;
 		pwr *= pwHL;
 		result += weight * signal;
 		weight *= gain * signal;
@@ -145,7 +145,7 @@
 
 	rmd = octaves - floor(octaves);
 	if (rmd != 0.0)
-		result += rmd * ((noise("perlin", p) + offset) * pwr);
+		result += rmd * ((safe_noise(p) + offset) * pwr);
 
 	return result;
 }
@@ -166,7 +166,7 @@
 	float pwr = pwHL;
 	int i;
 
-	signal = offset - fabs(noise("perlin", p));
+	signal = offset - fabs(safe_noise(p));
 	signal *= signal;
 	result = signal;
 	weight = 1.0;
@@ -174,7 +174,7 @@
 	for (i = 1; i < (int)octaves; i++) {
 		p *= lacunarity;
 		weight = clamp(signal * gain, 0.0, 1.0);
-		signal = offset - fabs(noise("perlin", p));
+		signal = offset - fabs(safe_noise(p));
 		signal *= signal;
 		signal *= weight;
 		result += signal * pwr;

Modified: trunk/blender/intern/cycles/kernel/shaders/node_texture.h
===================================================================
--- trunk/blender/intern/cycles/kernel/shaders/node_texture.h	2013-01-09 21:09:20 UTC (rev 53688)
+++ trunk/blender/intern/cycles/kernel/shaders/node_texture.h	2013-01-09 22:06:03 UTC (rev 53689)
@@ -151,12 +151,23 @@
 
 /* Noise Bases */
 
+float safe_noise(point p)
+{
+	float f = noise(p);
+
+	/* can happen for big coordinates, things even out to 0.5 then anyway */
+	if(!isfinite(f))
+		return 0.5;
+	
+	return f;
+}
+
 float noise_basis(point p, string basis)
 {
 	float result = 0.0;
 
 	if (basis == "Perlin")
-		result = noise(p); /* returns perlin noise in range 0..1 */
+		result = safe_noise(p); /* returns perlin noise in range 0..1 */
 	if (basis == "Voronoi F1")
 		result = voronoi_F1S(p);
 	if (basis == "Voronoi F2")

Modified: trunk/blender/intern/cycles/kernel/svm/svm_noise.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_noise.h	2013-01-09 21:09:20 UTC (rev 53688)
+++ trunk/blender/intern/cycles/kernel/svm/svm_noise.h	2013-01-09 22:06:03 UTC (rev 53689)
@@ -84,9 +84,8 @@
 
 __device float floorfrac(float x, int* i)
 {
-	float f = floorf(x);
-	*i = (int)f;
-	return x - f;
+	*i = quick_floor(x);
+	return x - *i;
 }
 
 __device float fade(float t)
@@ -133,7 +132,10 @@
 										grad (hash (X+1, Y  , Z+1), fx-1.0f, fy	 , fz-1.0f )),
 							   nerp (u, grad (hash (X  , Y+1, Z+1), fx	 , fy-1.0f, fz-1.0f ),
 										grad (hash (X+1, Y+1, Z+1), fx-1.0f, fy-1.0f, fz-1.0f ))));
-	return scale3(result);
+	float r = scale3(result);
+
+	/* can happen for big coordinates, things even out to 0.0 then anyway */
+	return (isfinite(r))? r: 0.0f;
 }
 
 __device_noinline float perlin_periodic(float x, float y, float z, float3 pperiod)
@@ -162,7 +164,10 @@
 										grad (phash (X+1, Y  , Z+1, p), fx-1.0f, fy	 , fz-1.0f )),
 							   nerp (u, grad (phash (X  , Y+1, Z+1, p), fx	 , fy-1.0f, fz-1.0f ),
 										grad (phash (X+1, Y+1, Z+1, p), fx-1.0f, fy-1.0f, fz-1.0f ))));
-	return scale3(result);
+	float r = scale3(result);
+
+	/* can happen for big coordinates, things even out to 0.0 then anyway */
+	return (isfinite(r))? r: 0.0f;
 }
 
 /* perlin noise in range 0..1 */




More information about the Bf-blender-cvs mailing list