Cycles code refactor: minor changes to light emission code.
This commit is contained in:
parent
781de742eb
commit
5ab565283d
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue