[Bf-blender-cvs] [34f4f7a] soc-2013-dingto: Cycles Volume: remove some unnecessary rngs from shadow computation.

Brecht Van Lommel noreply at git.blender.org
Thu Dec 26 15:57:59 CET 2013


Commit: 34f4f7a2eaa57a4146e6e983f3cc55870fa9512e
Author: Brecht Van Lommel
Date:   Thu Dec 26 15:39:46 2013 +0100
https://developer.blender.org/rB34f4f7a2eaa57a4146e6e983f3cc55870fa9512e

Cycles Volume: remove some unnecessary rngs from shadow computation.

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

M	intern/cycles/kernel/kernel_path.h
M	intern/cycles/kernel/kernel_volume.h

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

diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index 7a06ca6..161aabd 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -678,7 +678,7 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample,
 
 #ifdef __VOLUME__
 				float tmp_volume_pdf;
-				if(!shadow_blocked_volume(kg, &state, &light_ray, &ao_shadow, rng, &rng_congruential, rng_offset, sample, media_volume_shader, &tmp_volume_pdf))
+				if(!shadow_blocked_volume(kg, &state, &light_ray, &ao_shadow, &rng_congruential, sample, media_volume_shader, &tmp_volume_pdf))
 #else
 				if(!shadow_blocked(kg, &state, &light_ray, &ao_shadow))
 #endif
@@ -762,7 +762,7 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample,
 					float3 shadow;
 #ifdef __VOLUME__
 					float tmp_volume_pdf;
-					if(!shadow_blocked_volume(kg, &state, &light_ray, &shadow, rng, &rng_congruential, rng_offset, sample, media_volume_shader, &tmp_volume_pdf)) {
+					if(!shadow_blocked_volume(kg, &state, &light_ray, &shadow, &rng_congruential, sample, media_volume_shader, &tmp_volume_pdf)) {
 #else
 					if(!shadow_blocked(kg, &state, &light_ray, &shadow)) {
 #endif
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h
index a50ffe6..aca3e60 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -51,24 +51,21 @@ ccl_device float sigma_from_value(float value, float geom_factor)
 #endif
 }
 
-ccl_device float get_sigma_sample(KernelGlobals *kg, ShaderData *sd, float randv, int path_flag, float3 p)
+ccl_device float get_sigma_sample(KernelGlobals *kg, ShaderData *sd, int path_flag, float3 P)
 {
-       sd->P = p;
+	sd->P = P;
 
-#ifdef __MULTI_CLOSURE__
-       int sampled = 0;
+	/* todo: the SHADER_CONTEXT here an in other places is wrong, it should be
+	 * defined such that the same context can't be active at the same time more
+	 * than once, this does not seem to be the case now */
+	shader_eval_volume(kg, sd, 0.0f, path_flag, SHADER_CONTEXT_MAIN);
 
-       // if(sd->num_closure > 1)
+	/* todo: this assumes global density and is broken, density is per closure! */
+	int sampled = 0;
+	const ShaderClosure *sc = &sd->closure[sampled];
+	float v = sc->data0;
 
-       const ShaderClosure *sc = &sd->closure[sampled];
-
-       shader_eval_volume(kg, sd, randv, path_flag, SHADER_CONTEXT_MAIN);
-       float v = sc->data0;
-#else
-       shader_eval_volume(kg, sd, randv, path_flag, SHADER_CONTEXT_MAIN);
-       float v = sd->closure.data0;
-#endif
-       return sigma_from_value(v, 1.0f);
+	return sigma_from_value(v, 1.0f);
 }
 
 ccl_device  float3 kernel_volume_get_final_homogeneous_extinction_tsd(KernelGlobals *kg, ShaderData *sd, float trandp, Ray ray, int path_flag)
@@ -82,7 +79,7 @@ ccl_device  float3 kernel_volume_get_final_homogeneous_extinction_tsd(KernelGlob
 	float3 res_sigma = make_float3(1.0f, 1.0f, 1.0f);
 	if((sd->flag & SD_HAS_VOLUME) != 0) { // check for empty volume shader
 		// base sigma
-		float base_sigma = get_sigma_sample(kg, sd, trandp, path_flag, ray.P);
+		float base_sigma = get_sigma_sample(kg, sd, path_flag, ray.P);
 
 		// get transition probability
 		// or flux that pass forward even if catched by particle.
@@ -95,20 +92,13 @@ ccl_device  float3 kernel_volume_get_final_homogeneous_extinction_tsd(KernelGlob
 #if 0
 		transition_pdf = single_peaked_henyey_greenstein(1.0f, 0.6);
 #endif
-		// colors
-#ifdef __MULTI_CLOSURE__
-		int sampled = 0;        
 
-		// if(sd->num_closure > 1)
+		shader_eval_volume(kg, sd, 0.0f, path_flag, SHADER_CONTEXT_MAIN);
 
+		/* todo: this assumes global density and is broken, color is per closure! */
+		int sampled = 0;
 		const ShaderClosure *sc = &sd->closure[sampled];
-
-		shader_eval_volume(kg, sd, trandp, path_flag, SHADER_CONTEXT_MAIN);
 		float3 color = sc->weight;
-#else
-		shader_eval_volume(kg, sd, trandp, path_flag, SHADER_CONTEXT_MAIN);
-		float3 color = sd->closure.weight;
-#endif
 
 #if 1
 //		res_sigma = make_float3(base_sigma, base_sigma, base_sigma) / ( make_float3(transition_pdf, transition_pdf, transition_pdf) * color);
@@ -137,7 +127,7 @@ ccl_device  float3 kernel_volume_get_final_homogeneous_extinction_tsd(KernelGlob
 /* unused */
 ccl_device float kernel_volume_homogeneous_pdf( KernelGlobals *kg, ShaderData *sd, float distance)
 {
-	float sigma = get_sigma_sample(kg, sd, 0, 0, make_float3(0.0f, 0.0f, 0.0f));
+	float sigma = get_sigma_sample(kg, sd, 0, make_float3(0.0f, 0.0f, 0.0f));
 #ifdef __VOLUME_USE_GUARANTEE_HIT_PROB
 	return sigma * exp(-distance * sigma) * VOLUME_GUARANTEE_HIT_PROB;
 #else
@@ -158,7 +148,7 @@ ccl_device float3 kernel_volume_get_final_homogeneous_extinction(KernelGlobals *
 	float3 res_sigma = make_float3(1.0f, 1.0f, 1.0f);
 	if((tsd.flag & SD_HAS_VOLUME) != 0) { // check for empty volume shader
 		// base sigma
-		float base_sigma = get_sigma_sample(kg, &tsd, trandp, path_flag, ray.P);
+		float base_sigma = get_sigma_sample(kg, &tsd, path_flag, ray.P);
 
 		// get transition probability
 		BsdfEval eval;
@@ -167,19 +157,13 @@ ccl_device float3 kernel_volume_get_final_homogeneous_extinction(KernelGlobals *
 		shader_bsdf_eval(kg, &tsd, omega_in, &eval, &transition_pdf);
 
 		// colors
-#ifdef __MULTI_CLOSURE__
-		int sampled = 0;        
-
-		// if(tsd.num_closure > 1)
+		shader_eval_volume(kg, &tsd, 0.0f, path_flag, SHADER_CONTEXT_MAIN);
 
+		/* todo: this assumes global density and is broken, color is per closure! */
+		int sampled = 0;
 		const ShaderClosure *sc = &tsd.closure[sampled];
-
-		shader_eval_volume(kg, &tsd, trandp, path_flag, SHADER_CONTEXT_MAIN);
 		float3 color = sc->weight;
-#else
-		shader_eval_volume(kg, &tsd, trandp, path_flag, SHADER_CONTEXT_MAIN);
-		float3 color = tsd.closure.weight;
-#endif
+
 		res_sigma = make_float3(base_sigma, base_sigma, base_sigma) / (make_float3(transition_pdf, transition_pdf, transition_pdf) * color);
 	}
 
@@ -210,8 +194,8 @@ ccl_device int get_media_volume_shader(KernelGlobals *kg, float3 P, int bounce)
 #endif
 	{
 		ShaderData sd;
-        shader_setup_from_ray(kg, &sd, &isect, &ray, bounce);
-        shader_eval_surface(kg, &sd, 0.0f, 0, SHADER_CONTEXT_MAIN); // not needed ?
+		shader_setup_from_ray(kg, &sd, &isect, &ray, bounce);
+		shader_eval_surface(kg, &sd, 0.0f, 0, SHADER_CONTEXT_MAIN); // not needed ?
 
 		if(sd.flag & SD_BACKFACING) {
 			stack--;
@@ -247,7 +231,7 @@ ccl_device int kernel_volumetric_woodcock_sampler(KernelGlobals *kg, RNG *rng_co
 	
 	float step = end / 10.0f; // uses 10 segments for maximum - needs parameter
 	for(float s = 0.0f ; s < end ; s+= step)
-		max_sigma_t = max(max_sigma_t , get_sigma_sample(kg, sd, rand_congruential(), path_flag, ray.P + ray.D * s));
+		max_sigma_t = max(max_sigma_t , get_sigma_sample(kg, sd, path_flag, ray.P + ray.D * s));
 	
 	int i = 0;
 	float t = 0;
@@ -263,20 +247,20 @@ ccl_device int kernel_volumetric_woodcock_sampler(KernelGlobals *kg, RNG *rng_co
 		// *pdf *= sigma_factor; // pdf that previous position was transparent pseudo-particle, obviously 1.0 for first loop step
 		// *pdf *= max_sigma_t * r; // pdf of particle collision, based on conventional freefly homogeneous distance equation
 	}
-	while((sigma_factor = (get_sigma_sample(kg, sd, rand_congruential(), path_flag, ray.P + ray.D * t) / max_sigma_t)) < rand_congruential() && 
+	while((sigma_factor = (get_sigma_sample(kg, sd, path_flag, ray.P + ray.D * t) / max_sigma_t)) < rand_congruential() && 
 		t < (end - magic_eps) &&
 		i++ < max_iter);
 
 	if(t < (end - magic_eps) && i <= max_iter) {
 		*new_t = t;
-	    sd->P = ray.P + ray.D * t;
+		sd->P = ray.P + ray.D * t;
 		// *pdf *= sigma_factor; // fixme: is it necessary ?
 		return 1;
 	}
 
 	// Assume rest of media up to end is homogeneous, it helps when using woodcock in outdoor scenes that tend to have continuous density.
 	if((i > max_iter) && (t < (end - magic_eps))) {
-		float sigma = get_sigma_sample(kg, sd, rand_congruential(), path_flag, ray.P + ray.D * t);
+		float sigma = get_sigma_sample(kg, sd, path_flag, ray.P + ray.D * t);
 		if(sigma < magic_eps)
 			return 0;
 
@@ -285,7 +269,7 @@ ccl_device int kernel_volumetric_woodcock_sampler(KernelGlobals *kg, RNG *rng_co
 		*pdf *= sigma * r;
 		if(t < (end - magic_eps)) {
 			// double check current sigma, just to be sure we do not register event for null media.
-			if(get_sigma_sample(kg, sd, rand_congruential(), path_flag, ray.P + ray.D * t) > magic_eps) {
+			if(get_sigma_sample(kg, sd, path_flag, ray.P + ray.D * t) > magic_eps) {
 				*new_t = t;
 				sd->P = ray.P + ray.D * t;
 				return 1;
@@ -324,7 +308,7 @@ ccl_device int kernel_volumetric_woodcock_sampler2(KernelGlobals *kg, RNG *rng_c
 		// *pdf *= sigma_factor; // pdf that previous position was transparent pseudo-particle, obviously 1.0 for first loop step
 		// *pdf *= max_sigma_t * r; // pdf of particle collision, based on conventional freefly homogeneous distance equation
 	}
-	while((sigma_factor = (get_sigma_sample(kg, sd, rand_congruential(), path_flag, ray.P + ray.D * t) / max_sigma_t)) < rand_congruential() && 
+	while((sigma_factor = (get_sigma_sample(kg, sd, path_flag, ray.P + ray.D * t) / max_sigma_t)) < rand_congruential() && 
 		(t < (end - magic_eps)) &&
 		i++ < max_iter);
 
@@ -341,7 +325,7 @@ ccl_device int kernel_volumetric_woodcock_sampler2(KernelGlobals *kg, RNG *rng_c
 	// assume rest of media up to end is homogeneous, it help to use woodcock even in outdoor scenes that tend to have continuous density
 	// even if vary a bit in close distance. of course it make sampling biased (not respect actual density).
 	if((i > max_iter) && (t < (end - magic_eps))) {
-		float sigma = get_sigma_sample(kg, sd, rand_congruential(), path_flag, ray.P + ray.D * t);
+		float sigma = get_sigma_sample(kg, sd, path_flag, ray.P + ray.D * t);
 		if(sigma < magic_eps) 
 			return 0;
 		// t += -logf( rand_congruential()) / sigma;
@@ -350,7 +334,7 @@ ccl_device int kernel_volumetric_woodcock_sampler2(KernelGlobals *kg, RNG *rng_c
 		*pdf *= sigma * r;
 		if(t < (end - magic_eps)) {
 			// double check current sigma, just to be sure we do not register event for null media.
-			if(get_sigma

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list