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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to