Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/kernel_emission.h
| Show First 20 Lines • Show All 88 Lines • ▼ Show 20 Lines | |||||
| ccl_device_noinline bool direct_emission(KernelGlobals *kg, | ccl_device_noinline bool direct_emission(KernelGlobals *kg, | ||||
| ShaderData *sd, | ShaderData *sd, | ||||
| ShaderData *emission_sd, | ShaderData *emission_sd, | ||||
| LightSample *ls, | LightSample *ls, | ||||
| ccl_addr_space PathState *state, | ccl_addr_space PathState *state, | ||||
| Ray *ray, | Ray *ray, | ||||
| BsdfEval *eval, | BsdfEval *eval, | ||||
| bool *is_lamp) | bool *is_lamp, | ||||
| float rand_terminate) | |||||
brecht: Could use a more descriptive name, like `rand_terminate` | |||||
| { | { | ||||
| if(ls->pdf == 0.0f) | if(ls->pdf == 0.0f) | ||||
| return false; | return false; | ||||
| /* todo: implement */ | /* todo: implement */ | ||||
| differential3 dD = differential3_zero(); | differential3 dD = differential3_zero(); | ||||
| /* evaluate closure */ | /* evaluate closure */ | ||||
| Show All 23 Lines | if(ls->shader & SHADER_USE_MIS) { | ||||
| float mis_weight = power_heuristic(ls->pdf, bsdf_pdf); | float mis_weight = power_heuristic(ls->pdf, bsdf_pdf); | ||||
| light_eval *= mis_weight; | light_eval *= mis_weight; | ||||
| } | } | ||||
| } | } | ||||
| #else | #else | ||||
| shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS); | shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS); | ||||
| #endif | #endif | ||||
| bsdf_eval_mul(eval, light_eval/ls->pdf); | bsdf_eval_mul3(eval, light_eval/ls->pdf); | ||||
| #ifdef __PASSES__ | #ifdef __PASSES__ | ||||
| /* use visibility flag to skip lights */ | /* use visibility flag to skip lights */ | ||||
| if(ls->shader & SHADER_EXCLUDE_ANY) { | if(ls->shader & SHADER_EXCLUDE_ANY) { | ||||
| if(ls->shader & SHADER_EXCLUDE_DIFFUSE) { | if(ls->shader & SHADER_EXCLUDE_DIFFUSE) { | ||||
| eval->diffuse = make_float3(0.0f, 0.0f, 0.0f); | eval->diffuse = make_float3(0.0f, 0.0f, 0.0f); | ||||
| eval->subsurface = make_float3(0.0f, 0.0f, 0.0f); | eval->subsurface = 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); | 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); | eval->transmission = make_float3(0.0f, 0.0f, 0.0f); | ||||
| if(ls->shader & SHADER_EXCLUDE_SCATTER) | if(ls->shader & SHADER_EXCLUDE_SCATTER) | ||||
| eval->scatter = make_float3(0.0f, 0.0f, 0.0f); | eval->scatter = make_float3(0.0f, 0.0f, 0.0f); | ||||
| } | } | ||||
| #endif | #endif | ||||
| if(bsdf_eval_is_zero(eval)) | if(bsdf_eval_is_zero(eval)) | ||||
| return false; | return false; | ||||
| if(kernel_data.integrator.light_inv_rr_threshold > 0.0f) { | |||||
| float probability = max3(bsdf_eval_sum(eval)) * kernel_data.integrator.light_inv_rr_threshold; | |||||
Not Done Inline ActionsI suggest to go with max channel rather than average. brecht: I suggest to go with max channel rather than average. | |||||
| if(probability < 1.0f) { | |||||
| if(rand_terminate >= probability) { | |||||
| return false; | |||||
| } | |||||
| bsdf_eval_mul(eval, 1.0f / probability); | |||||
| } | |||||
| } | |||||
| if(ls->shader & SHADER_CAST_SHADOW) { | if(ls->shader & SHADER_CAST_SHADOW) { | ||||
| /* setup ray */ | /* setup ray */ | ||||
| bool transmit = (dot(ccl_fetch(sd, Ng), ls->D) < 0.0f); | bool transmit = (dot(ccl_fetch(sd, Ng), ls->D) < 0.0f); | ||||
| ray->P = ray_offset(ccl_fetch(sd, P), (transmit)? -ccl_fetch(sd, Ng): ccl_fetch(sd, Ng)); | ray->P = ray_offset(ccl_fetch(sd, P), (transmit)? -ccl_fetch(sd, Ng): ccl_fetch(sd, Ng)); | ||||
| if(ls->t == FLT_MAX) { | if(ls->t == FLT_MAX) { | ||||
| /* distant light */ | /* distant light */ | ||||
| ray->D = ls->D; | ray->D = ls->D; | ||||
| ▲ Show 20 Lines • Show All 165 Lines • Show Last 20 Lines | |||||
Could use a more descriptive name, like rand_terminate