diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-04-04 00:43:56 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-06-14 15:49:55 +0400 |
commit | 5ab565283d594e51ef2589326bc68957c323061d (patch) | |
tree | 7af40aa5ed2f524eee0f962672262f5a382e723d /intern/cycles | |
parent | 781de742eb116e8c3103f34b2f9fd5ccb2f812d6 (diff) |
Cycles code refactor: minor changes to light emission code.
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/kernel/kernel_emission.h | 58 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_path.h | 58 |
2 files changed, 59 insertions, 57 deletions
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index deffa7f2ba2..b382e2c833b 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -63,32 +63,18 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg, return eval; } -ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, - float randt, float randu, float randv, Ray *ray, BsdfEval *eval, - bool *is_lamp, int bounce, int transparent_bounce) +ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, + LightSample *ls, Ray *ray, BsdfEval *eval, bool *is_lamp, + int bounce, int transparent_bounce) { - LightSample ls; - -#ifdef __BRANCHED_PATH__ - if(lindex != LAMP_NONE) { - /* sample position on a specified light */ - light_select(kg, lindex, randu, randv, sd->P, &ls); - } - else -#endif - { - /* sample a light and position on int */ - light_sample(kg, randt, randu, randv, sd->time, sd->P, &ls); - } - - if(ls.pdf == 0.0f) + if(ls->pdf == 0.0f) return false; /* todo: implement */ differential3 dD = differential3_zero(); /* evaluate closure */ - float3 light_eval = direct_emissive_eval(kg, &ls, -ls.D, dD, ls.t, sd->time, bounce, transparent_bounce); + float3 light_eval = direct_emissive_eval(kg, ls, -ls->D, dD, ls->t, sd->time, bounce, transparent_bounce); if(is_zero(light_eval)) return false; @@ -98,29 +84,29 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int #ifdef __VOLUME__ if(sd->prim != PRIM_NONE) - shader_bsdf_eval(kg, sd, ls.D, eval, &bsdf_pdf); + shader_bsdf_eval(kg, sd, ls->D, eval, &bsdf_pdf); else - shader_volume_phase_eval(kg, sd, ls.D, eval, &bsdf_pdf); + shader_volume_phase_eval(kg, sd, ls->D, eval, &bsdf_pdf); #else - shader_bsdf_eval(kg, sd, ls.D, eval, &bsdf_pdf); + shader_bsdf_eval(kg, sd, ls->D, eval, &bsdf_pdf); #endif - if(ls.shader & SHADER_USE_MIS) { + if(ls->shader & SHADER_USE_MIS) { /* multiple importance sampling */ - float mis_weight = power_heuristic(ls.pdf, bsdf_pdf); + float mis_weight = power_heuristic(ls->pdf, bsdf_pdf); light_eval *= mis_weight; } - bsdf_eval_mul(eval, light_eval/ls.pdf); + bsdf_eval_mul(eval, light_eval/ls->pdf); #ifdef __PASSES__ /* use visibility flag to skip lights */ - if(ls.shader & SHADER_EXCLUDE_ANY) { - if(ls.shader & SHADER_EXCLUDE_DIFFUSE) + if(ls->shader & SHADER_EXCLUDE_ANY) { + if(ls->shader & SHADER_EXCLUDE_DIFFUSE) eval->diffuse = make_float3(0.0f, 0.0f, 0.0f); - if(ls.shader & SHADER_EXCLUDE_GLOSSY) + if(ls->shader & SHADER_EXCLUDE_GLOSSY) eval->glossy = make_float3(0.0f, 0.0f, 0.0f); - if(ls.shader & SHADER_EXCLUDE_TRANSMIT) + if(ls->shader & SHADER_EXCLUDE_TRANSMIT) eval->transmission = make_float3(0.0f, 0.0f, 0.0f); } #endif @@ -128,19 +114,19 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int if(bsdf_eval_is_zero(eval)) return false; - if(ls.shader & SHADER_CAST_SHADOW) { + if(ls->shader & SHADER_CAST_SHADOW) { /* setup ray */ - bool transmit = (dot(sd->Ng, ls.D) < 0.0f); + bool transmit = (dot(sd->Ng, ls->D) < 0.0f); ray->P = ray_offset(sd->P, (transmit)? -sd->Ng: sd->Ng); - if(ls.t == FLT_MAX) { + if(ls->t == FLT_MAX) { /* distant light */ - ray->D = ls.D; - ray->t = ls.t; + ray->D = ls->D; + ray->t = ls->t; } else { /* other lights, avoid self-intersection */ - ray->D = ray_offset(ls.P, ls.Ng) - ray->P; + ray->D = ray_offset(ls->P, ls->Ng) - ray->P; ray->D = normalize_len(ray->D, &ray->t); } @@ -153,7 +139,7 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int } /* return if it's a lamp for shadow pass */ - *is_lamp = (ls.prim == PRIM_NONE && ls.type != LIGHT_BACKGROUND); + *is_lamp = (ls->prim == PRIM_NONE && ls->type != LIGHT_BACKGROUND); return true; } diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index b57e27400b9..70366eaac90 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -52,29 +52,30 @@ ccl_device_inline bool kernel_path_integrate_scatter_lighting(KernelGlobals *kg, float num_samples_adjust) { #ifdef __EMISSION__ - if(kernel_data.integrator.use_direct_light) { + if(kernel_data.integrator.use_direct_light && (sd->flag & SD_BSDF_HAS_EVAL)) { /* sample illumination from lights to find path contribution */ - if(sd->flag & SD_BSDF_HAS_EVAL) { - float light_t = path_state_rng_1D(kg, rng, state, PRNG_LIGHT); - float light_u, light_v; - path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, &light_u, &light_v); + float light_t = path_state_rng_1D(kg, rng, state, PRNG_LIGHT); + float light_u, light_v; + path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, &light_u, &light_v); - Ray light_ray; - BsdfEval L_light; - bool is_lamp; + Ray light_ray; + BsdfEval L_light; + bool is_lamp; #ifdef __OBJECT_MOTION__ - light_ray.time = sd->time; + light_ray.time = sd->time; #endif - if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) { - /* trace shadow ray */ - float3 shadow; + LightSample ls; + light_sample(kg, light_t, light_u, light_v, sd->time, sd->P, &ls); - if(!shadow_blocked(kg, state, &light_ray, &shadow)) { - /* accumulate */ - path_radiance_accum_light(L, *throughput * num_samples_adjust, &L_light, shadow, 1.0f, state->bounce, is_lamp); - } + if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) { + /* trace shadow ray */ + float3 shadow; + + if(!shadow_blocked(kg, state, &light_ray, &shadow)) { + /* accumulate */ + path_radiance_accum_light(L, *throughput * num_samples_adjust, &L_light, shadow, 1.0f, state->bounce, is_lamp); } } } @@ -152,7 +153,10 @@ ccl_device void kernel_branched_path_integrate_direct_lighting(KernelGlobals *kg float light_u, light_v; path_branched_rng_2D(kg, &lamp_rng, state, j, num_samples, PRNG_LIGHT_U, &light_u, &light_v); - if(direct_emission(kg, sd, i, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) { + LightSample ls; + light_select(kg, i, light_u, light_v, sd->P, &ls); + + if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) { /* trace shadow ray */ float3 shadow; @@ -181,7 +185,10 @@ ccl_device void kernel_branched_path_integrate_direct_lighting(KernelGlobals *kg if(kernel_data.integrator.num_all_lights) light_t = 0.5f*light_t; - if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) { + LightSample ls; + light_sample(kg, light_t, light_u, light_v, sd->time, sd->P, &ls); + + if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) { /* trace shadow ray */ float3 shadow; @@ -198,8 +205,11 @@ ccl_device void kernel_branched_path_integrate_direct_lighting(KernelGlobals *kg float light_u, light_v; path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, &light_u, &light_v); + LightSample ls; + light_sample(kg, light_t, light_u, light_v, sd->time, sd->P, &ls); + /* sample random light */ - if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) { + if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) { /* trace shadow ray */ float3 shadow; @@ -477,7 +487,10 @@ ccl_device_inline bool kernel_path_integrate_lighting(KernelGlobals *kg, RNG *rn light_ray.time = sd->time; #endif - if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) { + LightSample ls; + light_sample(kg, light_t, light_u, light_v, sd->time, sd->P, &ls); + + if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) { /* trace shadow ray */ float3 shadow; @@ -882,7 +895,10 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, light_ray.time = sd.time; #endif - if(direct_emission(kg, &sd, LAMP_NONE, light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce, state.transparent_bounce)) { + LightSample ls; + light_sample(kg, light_t, light_u, light_v, sd.time, sd.P, &ls); + + if(direct_emission(kg, &sd, &ls, &light_ray, &L_light, &is_lamp, state.bounce, state.transparent_bounce)) { /* trace shadow ray */ float3 shadow; |