[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