diff options
Diffstat (limited to 'intern/cycles/kernel/kernel_accumulate.h')
-rw-r--r-- | intern/cycles/kernel/kernel_accumulate.h | 1093 |
1 files changed, 546 insertions, 547 deletions
diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h index 86ad6e1a061..b9d723222a1 100644 --- a/intern/cycles/kernel/kernel_accumulate.h +++ b/intern/cycles/kernel/kernel_accumulate.h @@ -21,149 +21,150 @@ CCL_NAMESPACE_BEGIN * BSDF evaluation result, split per BSDF type. This is used to accumulate * render passes separately. */ -ccl_device float3 shader_bsdf_transparency(KernelGlobals *kg, - const ShaderData *sd); +ccl_device float3 shader_bsdf_transparency(KernelGlobals *kg, const ShaderData *sd); -ccl_device_inline void bsdf_eval_init(BsdfEval *eval, ClosureType type, float3 value, int use_light_pass) +ccl_device_inline void bsdf_eval_init(BsdfEval *eval, + ClosureType type, + float3 value, + int use_light_pass) { #ifdef __PASSES__ - eval->use_light_pass = use_light_pass; - - if(eval->use_light_pass) { - eval->diffuse = make_float3(0.0f, 0.0f, 0.0f); - eval->glossy = make_float3(0.0f, 0.0f, 0.0f); - eval->transmission = make_float3(0.0f, 0.0f, 0.0f); - eval->transparent = make_float3(0.0f, 0.0f, 0.0f); - eval->subsurface = make_float3(0.0f, 0.0f, 0.0f); - eval->scatter = make_float3(0.0f, 0.0f, 0.0f); - - if(type == CLOSURE_BSDF_TRANSPARENT_ID) - eval->transparent = value; - else if(CLOSURE_IS_BSDF_DIFFUSE(type)) - eval->diffuse = value; - else if(CLOSURE_IS_BSDF_GLOSSY(type)) - eval->glossy = value; - else if(CLOSURE_IS_BSDF_TRANSMISSION(type)) - eval->transmission = value; - else if(CLOSURE_IS_BSDF_BSSRDF(type)) - eval->subsurface = value; - else if(CLOSURE_IS_PHASE(type)) - eval->scatter = value; - } - else -#endif - { - eval->diffuse = value; - } + eval->use_light_pass = use_light_pass; + + if (eval->use_light_pass) { + eval->diffuse = make_float3(0.0f, 0.0f, 0.0f); + eval->glossy = make_float3(0.0f, 0.0f, 0.0f); + eval->transmission = make_float3(0.0f, 0.0f, 0.0f); + eval->transparent = make_float3(0.0f, 0.0f, 0.0f); + eval->subsurface = make_float3(0.0f, 0.0f, 0.0f); + eval->scatter = make_float3(0.0f, 0.0f, 0.0f); + + if (type == CLOSURE_BSDF_TRANSPARENT_ID) + eval->transparent = value; + else if (CLOSURE_IS_BSDF_DIFFUSE(type)) + eval->diffuse = value; + else if (CLOSURE_IS_BSDF_GLOSSY(type)) + eval->glossy = value; + else if (CLOSURE_IS_BSDF_TRANSMISSION(type)) + eval->transmission = value; + else if (CLOSURE_IS_BSDF_BSSRDF(type)) + eval->subsurface = value; + else if (CLOSURE_IS_PHASE(type)) + eval->scatter = value; + } + else +#endif + { + eval->diffuse = value; + } #ifdef __SHADOW_TRICKS__ - eval->sum_no_mis = make_float3(0.0f, 0.0f, 0.0f); + eval->sum_no_mis = make_float3(0.0f, 0.0f, 0.0f); #endif } -ccl_device_inline void bsdf_eval_accum(BsdfEval *eval, ClosureType type, float3 value, float mis_weight) +ccl_device_inline void bsdf_eval_accum(BsdfEval *eval, + ClosureType type, + float3 value, + float mis_weight) { #ifdef __SHADOW_TRICKS__ - eval->sum_no_mis += value; + eval->sum_no_mis += value; #endif - value *= mis_weight; + value *= mis_weight; #ifdef __PASSES__ - if(eval->use_light_pass) { - if(CLOSURE_IS_BSDF_DIFFUSE(type)) - eval->diffuse += value; - else if(CLOSURE_IS_BSDF_GLOSSY(type)) - eval->glossy += value; - else if(CLOSURE_IS_BSDF_TRANSMISSION(type)) - eval->transmission += value; - else if(CLOSURE_IS_BSDF_BSSRDF(type)) - eval->subsurface += value; - else if(CLOSURE_IS_PHASE(type)) - eval->scatter += value; - - /* skipping transparent, this function is used by for eval(), will be zero then */ - } - else -#endif - { - eval->diffuse += value; - } + if (eval->use_light_pass) { + if (CLOSURE_IS_BSDF_DIFFUSE(type)) + eval->diffuse += value; + else if (CLOSURE_IS_BSDF_GLOSSY(type)) + eval->glossy += value; + else if (CLOSURE_IS_BSDF_TRANSMISSION(type)) + eval->transmission += value; + else if (CLOSURE_IS_BSDF_BSSRDF(type)) + eval->subsurface += value; + else if (CLOSURE_IS_PHASE(type)) + eval->scatter += value; + + /* skipping transparent, this function is used by for eval(), will be zero then */ + } + else +#endif + { + eval->diffuse += value; + } } ccl_device_inline bool bsdf_eval_is_zero(BsdfEval *eval) { #ifdef __PASSES__ - if(eval->use_light_pass) { - return is_zero(eval->diffuse) - && is_zero(eval->glossy) - && is_zero(eval->transmission) - && is_zero(eval->transparent) - && is_zero(eval->subsurface) - && is_zero(eval->scatter); - } - else -#endif - { - return is_zero(eval->diffuse); - } + if (eval->use_light_pass) { + return is_zero(eval->diffuse) && is_zero(eval->glossy) && is_zero(eval->transmission) && + is_zero(eval->transparent) && is_zero(eval->subsurface) && is_zero(eval->scatter); + } + else +#endif + { + return is_zero(eval->diffuse); + } } ccl_device_inline void bsdf_eval_mis(BsdfEval *eval, float value) { #ifdef __PASSES__ - if(eval->use_light_pass) { - eval->diffuse *= value; - eval->glossy *= value; - eval->transmission *= value; - eval->subsurface *= value; - eval->scatter *= value; - - /* skipping transparent, this function is used by for eval(), will be zero then */ - } - else -#endif - { - eval->diffuse *= value; - } + if (eval->use_light_pass) { + eval->diffuse *= value; + eval->glossy *= value; + eval->transmission *= value; + eval->subsurface *= value; + eval->scatter *= value; + + /* skipping transparent, this function is used by for eval(), will be zero then */ + } + else +#endif + { + eval->diffuse *= value; + } } ccl_device_inline void bsdf_eval_mul(BsdfEval *eval, float value) { #ifdef __SHADOW_TRICKS__ - eval->sum_no_mis *= value; + eval->sum_no_mis *= value; #endif - bsdf_eval_mis(eval, value); + bsdf_eval_mis(eval, value); } ccl_device_inline void bsdf_eval_mul3(BsdfEval *eval, float3 value) { #ifdef __SHADOW_TRICKS__ - eval->sum_no_mis *= value; + eval->sum_no_mis *= value; #endif #ifdef __PASSES__ - if(eval->use_light_pass) { - eval->diffuse *= value; - eval->glossy *= value; - eval->transmission *= value; - eval->subsurface *= value; - eval->scatter *= value; - - /* skipping transparent, this function is used by for eval(), will be zero then */ - } - else - eval->diffuse *= value; + if (eval->use_light_pass) { + eval->diffuse *= value; + eval->glossy *= value; + eval->transmission *= value; + eval->subsurface *= value; + eval->scatter *= value; + + /* skipping transparent, this function is used by for eval(), will be zero then */ + } + else + eval->diffuse *= value; #else - eval->diffuse *= value; + eval->diffuse *= value; #endif } ccl_device_inline float3 bsdf_eval_sum(const BsdfEval *eval) { #ifdef __PASSES__ - if(eval->use_light_pass) { - return eval->diffuse + eval->glossy + eval->transmission + eval->subsurface + eval->scatter; - } - else + if (eval->use_light_pass) { + return eval->diffuse + eval->glossy + eval->transmission + eval->subsurface + eval->scatter; + } + else #endif - return eval->diffuse; + return eval->diffuse; } /* Path Radiance @@ -175,115 +176,113 @@ ccl_device_inline float3 bsdf_eval_sum(const BsdfEval *eval) ccl_device_inline void path_radiance_init(PathRadiance *L, int use_light_pass) { - /* clear all */ + /* clear all */ #ifdef __PASSES__ - L->use_light_pass = use_light_pass; - - if(use_light_pass) { - L->indirect = make_float3(0.0f, 0.0f, 0.0f); - L->direct_emission = make_float3(0.0f, 0.0f, 0.0f); - - L->color_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->color_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->color_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->color_subsurface = make_float3(0.0f, 0.0f, 0.0f); - - L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f); - L->direct_scatter = make_float3(0.0f, 0.0f, 0.0f); - - L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_scatter = make_float3(0.0f, 0.0f, 0.0f); - - L->transparent = 0.0f; - L->emission = make_float3(0.0f, 0.0f, 0.0f); - L->background = make_float3(0.0f, 0.0f, 0.0f); - L->ao = make_float3(0.0f, 0.0f, 0.0f); - L->shadow = make_float4(0.0f, 0.0f, 0.0f, 0.0f); - L->mist = 0.0f; - - L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->state.glossy = make_float3(0.0f, 0.0f, 0.0f); - L->state.transmission = make_float3(0.0f, 0.0f, 0.0f); - L->state.subsurface = make_float3(0.0f, 0.0f, 0.0f); - L->state.scatter = make_float3(0.0f, 0.0f, 0.0f); - L->state.direct = make_float3(0.0f, 0.0f, 0.0f); - } - else -#endif - { - L->transparent = 0.0f; - L->emission = make_float3(0.0f, 0.0f, 0.0f); - } + L->use_light_pass = use_light_pass; + + if (use_light_pass) { + L->indirect = make_float3(0.0f, 0.0f, 0.0f); + L->direct_emission = make_float3(0.0f, 0.0f, 0.0f); + + L->color_diffuse = make_float3(0.0f, 0.0f, 0.0f); + L->color_glossy = make_float3(0.0f, 0.0f, 0.0f); + L->color_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->color_subsurface = make_float3(0.0f, 0.0f, 0.0f); + + L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f); + L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f); + L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f); + L->direct_scatter = make_float3(0.0f, 0.0f, 0.0f); + + L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_scatter = make_float3(0.0f, 0.0f, 0.0f); + + L->transparent = 0.0f; + L->emission = make_float3(0.0f, 0.0f, 0.0f); + L->background = make_float3(0.0f, 0.0f, 0.0f); + L->ao = make_float3(0.0f, 0.0f, 0.0f); + L->shadow = make_float4(0.0f, 0.0f, 0.0f, 0.0f); + L->mist = 0.0f; + + L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f); + L->state.glossy = make_float3(0.0f, 0.0f, 0.0f); + L->state.transmission = make_float3(0.0f, 0.0f, 0.0f); + L->state.subsurface = make_float3(0.0f, 0.0f, 0.0f); + L->state.scatter = make_float3(0.0f, 0.0f, 0.0f); + L->state.direct = make_float3(0.0f, 0.0f, 0.0f); + } + else +#endif + { + L->transparent = 0.0f; + L->emission = make_float3(0.0f, 0.0f, 0.0f); + } #ifdef __SHADOW_TRICKS__ - L->path_total = make_float3(0.0f, 0.0f, 0.0f); - L->path_total_shaded = make_float3(0.0f, 0.0f, 0.0f); - L->shadow_background_color = make_float3(0.0f, 0.0f, 0.0f); - L->shadow_throughput = 0.0f; - L->shadow_transparency = 1.0f; - L->has_shadow_catcher = 0; + L->path_total = make_float3(0.0f, 0.0f, 0.0f); + L->path_total_shaded = make_float3(0.0f, 0.0f, 0.0f); + L->shadow_background_color = make_float3(0.0f, 0.0f, 0.0f); + L->shadow_throughput = 0.0f; + L->shadow_transparency = 1.0f; + L->has_shadow_catcher = 0; #endif #ifdef __DENOISING_FEATURES__ - L->denoising_normal = make_float3(0.0f, 0.0f, 0.0f); - L->denoising_albedo = make_float3(0.0f, 0.0f, 0.0f); - L->denoising_depth = 0.0f; + L->denoising_normal = make_float3(0.0f, 0.0f, 0.0f); + L->denoising_albedo = make_float3(0.0f, 0.0f, 0.0f); + L->denoising_depth = 0.0f; #endif #ifdef __KERNEL_DEBUG__ - L->debug_data.num_bvh_traversed_nodes = 0; - L->debug_data.num_bvh_traversed_instances = 0; - L->debug_data.num_bvh_intersections = 0; - L->debug_data.num_ray_bounces = 0; + L->debug_data.num_bvh_traversed_nodes = 0; + L->debug_data.num_bvh_traversed_instances = 0; + L->debug_data.num_bvh_intersections = 0; + L->debug_data.num_ray_bounces = 0; #endif } -ccl_device_inline void path_radiance_bsdf_bounce( - KernelGlobals *kg, - PathRadianceState *L_state, - ccl_addr_space float3 *throughput, - BsdfEval *bsdf_eval, - float bsdf_pdf, int bounce, int bsdf_label) +ccl_device_inline void path_radiance_bsdf_bounce(KernelGlobals *kg, + PathRadianceState *L_state, + ccl_addr_space float3 *throughput, + BsdfEval *bsdf_eval, + float bsdf_pdf, + int bounce, + int bsdf_label) { - float inverse_pdf = 1.0f/bsdf_pdf; + float inverse_pdf = 1.0f / bsdf_pdf; #ifdef __PASSES__ - if(kernel_data.film.use_light_pass) { - if(bounce == 0 && !(bsdf_label & LABEL_TRANSPARENT)) { - /* first on directly visible surface */ - float3 value = *throughput*inverse_pdf; - - L_state->diffuse = bsdf_eval->diffuse*value; - L_state->glossy = bsdf_eval->glossy*value; - L_state->transmission = bsdf_eval->transmission*value; - L_state->subsurface = bsdf_eval->subsurface*value; - L_state->scatter = bsdf_eval->scatter*value; - - *throughput = L_state->diffuse + - L_state->glossy + - L_state->transmission + - L_state->subsurface + - L_state->scatter; - - L_state->direct = *throughput; - } - else { - /* transparent bounce before first hit, or indirectly visible through BSDF */ - float3 sum = (bsdf_eval_sum(bsdf_eval) + bsdf_eval->transparent) * inverse_pdf; - *throughput *= sum; - } - } - else -#endif - { - *throughput *= bsdf_eval->diffuse*inverse_pdf; - } + if (kernel_data.film.use_light_pass) { + if (bounce == 0 && !(bsdf_label & LABEL_TRANSPARENT)) { + /* first on directly visible surface */ + float3 value = *throughput * inverse_pdf; + + L_state->diffuse = bsdf_eval->diffuse * value; + L_state->glossy = bsdf_eval->glossy * value; + L_state->transmission = bsdf_eval->transmission * value; + L_state->subsurface = bsdf_eval->subsurface * value; + L_state->scatter = bsdf_eval->scatter * value; + + *throughput = L_state->diffuse + L_state->glossy + L_state->transmission + + L_state->subsurface + L_state->scatter; + + L_state->direct = *throughput; + } + else { + /* transparent bounce before first hit, or indirectly visible through BSDF */ + float3 sum = (bsdf_eval_sum(bsdf_eval) + bsdf_eval->transparent) * inverse_pdf; + *throughput *= sum; + } + } + else +#endif + { + *throughput *= bsdf_eval->diffuse * inverse_pdf; + } } ccl_device_inline void path_radiance_accum_emission(PathRadiance *L, @@ -292,25 +291,25 @@ ccl_device_inline void path_radiance_accum_emission(PathRadiance *L, float3 value) { #ifdef __SHADOW_TRICKS__ - if(state->flag & PATH_RAY_SHADOW_CATCHER) { - return; - } + if (state->flag & PATH_RAY_SHADOW_CATCHER) { + return; + } #endif #ifdef __PASSES__ - if(L->use_light_pass) { - if(state->bounce == 0) - L->emission += throughput*value; - else if(state->bounce == 1) - L->direct_emission += throughput*value; - else - L->indirect += throughput*value; - } - else -#endif - { - L->emission += throughput*value; - } + if (L->use_light_pass) { + if (state->bounce == 0) + L->emission += throughput * value; + else if (state->bounce == 1) + L->direct_emission += throughput * value; + else + L->indirect += throughput * value; + } + else +#endif + { + L->emission += throughput * value; + } } ccl_device_inline void path_radiance_accum_ao(PathRadiance *L, @@ -320,57 +319,56 @@ ccl_device_inline void path_radiance_accum_ao(PathRadiance *L, float3 bsdf, float3 ao) { - /* Store AO pass. */ - if(L->use_light_pass && state->bounce == 0) { - L->ao += alpha*throughput*ao; - } + /* Store AO pass. */ + if (L->use_light_pass && state->bounce == 0) { + L->ao += alpha * throughput * ao; + } #ifdef __SHADOW_TRICKS__ - /* For shadow catcher, accumulate ratio. */ - if(state->flag & PATH_RAY_STORE_SHADOW_INFO) { - float3 light = throughput * bsdf; - L->path_total += light; - L->path_total_shaded += ao * light; + /* For shadow catcher, accumulate ratio. */ + if (state->flag & PATH_RAY_STORE_SHADOW_INFO) { + float3 light = throughput * bsdf; + L->path_total += light; + L->path_total_shaded += ao * light; - if(state->flag & PATH_RAY_SHADOW_CATCHER) { - return; - } - } + if (state->flag & PATH_RAY_SHADOW_CATCHER) { + return; + } + } #endif #ifdef __PASSES__ - if(L->use_light_pass) { - if(state->bounce == 0) { - /* Directly visible lighting. */ - L->direct_diffuse += throughput*bsdf*ao; - } - else { - /* Indirectly visible lighting after BSDF bounce. */ - L->indirect += throughput*bsdf*ao; - } - } - else -#endif - { - L->emission += throughput*bsdf*ao; - } + if (L->use_light_pass) { + if (state->bounce == 0) { + /* Directly visible lighting. */ + L->direct_diffuse += throughput * bsdf * ao; + } + else { + /* Indirectly visible lighting after BSDF bounce. */ + L->indirect += throughput * bsdf * ao; + } + } + else +#endif + { + L->emission += throughput * bsdf * ao; + } } -ccl_device_inline void path_radiance_accum_total_ao( - PathRadiance *L, - ccl_addr_space PathState *state, - float3 throughput, - float3 bsdf) +ccl_device_inline void path_radiance_accum_total_ao(PathRadiance *L, + ccl_addr_space PathState *state, + float3 throughput, + float3 bsdf) { #ifdef __SHADOW_TRICKS__ - if(state->flag & PATH_RAY_STORE_SHADOW_INFO) { - L->path_total += throughput * bsdf; - } + if (state->flag & PATH_RAY_STORE_SHADOW_INFO) { + L->path_total += throughput * bsdf; + } #else - (void) L; - (void) state; - (void) throughput; - (void) bsdf; + (void)L; + (void)state; + (void)throughput; + (void)bsdf; #endif } @@ -383,171 +381,166 @@ ccl_device_inline void path_radiance_accum_light(PathRadiance *L, bool is_lamp) { #ifdef __SHADOW_TRICKS__ - if(state->flag & PATH_RAY_STORE_SHADOW_INFO) { - float3 light = throughput * bsdf_eval->sum_no_mis; - L->path_total += light; - L->path_total_shaded += shadow * light; + if (state->flag & PATH_RAY_STORE_SHADOW_INFO) { + float3 light = throughput * bsdf_eval->sum_no_mis; + L->path_total += light; + L->path_total_shaded += shadow * light; - if(state->flag & PATH_RAY_SHADOW_CATCHER) { - return; - } - } + if (state->flag & PATH_RAY_SHADOW_CATCHER) { + return; + } + } #endif #ifdef __PASSES__ - if(L->use_light_pass) { - if(state->bounce == 0) { - /* directly visible lighting */ - L->direct_diffuse += throughput*bsdf_eval->diffuse*shadow; - L->direct_glossy += throughput*bsdf_eval->glossy*shadow; - L->direct_transmission += throughput*bsdf_eval->transmission*shadow; - L->direct_subsurface += throughput*bsdf_eval->subsurface*shadow; - L->direct_scatter += throughput*bsdf_eval->scatter*shadow; - - if(is_lamp) { - L->shadow.x += shadow.x*shadow_fac; - L->shadow.y += shadow.y*shadow_fac; - L->shadow.z += shadow.z*shadow_fac; - } - } - else { - /* indirectly visible lighting after BSDF bounce */ - L->indirect += throughput*bsdf_eval_sum(bsdf_eval)*shadow; - } - } - else -#endif - { - L->emission += throughput*bsdf_eval->diffuse*shadow; - } + if (L->use_light_pass) { + if (state->bounce == 0) { + /* directly visible lighting */ + L->direct_diffuse += throughput * bsdf_eval->diffuse * shadow; + L->direct_glossy += throughput * bsdf_eval->glossy * shadow; + L->direct_transmission += throughput * bsdf_eval->transmission * shadow; + L->direct_subsurface += throughput * bsdf_eval->subsurface * shadow; + L->direct_scatter += throughput * bsdf_eval->scatter * shadow; + + if (is_lamp) { + L->shadow.x += shadow.x * shadow_fac; + L->shadow.y += shadow.y * shadow_fac; + L->shadow.z += shadow.z * shadow_fac; + } + } + else { + /* indirectly visible lighting after BSDF bounce */ + L->indirect += throughput * bsdf_eval_sum(bsdf_eval) * shadow; + } + } + else +#endif + { + L->emission += throughput * bsdf_eval->diffuse * shadow; + } } -ccl_device_inline void path_radiance_accum_total_light( - PathRadiance *L, - ccl_addr_space PathState *state, - float3 throughput, - const BsdfEval *bsdf_eval) +ccl_device_inline void path_radiance_accum_total_light(PathRadiance *L, + ccl_addr_space PathState *state, + float3 throughput, + const BsdfEval *bsdf_eval) { #ifdef __SHADOW_TRICKS__ - if(state->flag & PATH_RAY_STORE_SHADOW_INFO) { - L->path_total += throughput * bsdf_eval->sum_no_mis; - } + if (state->flag & PATH_RAY_STORE_SHADOW_INFO) { + L->path_total += throughput * bsdf_eval->sum_no_mis; + } #else - (void) L; - (void) state; - (void) throughput; - (void) bsdf_eval; + (void)L; + (void)state; + (void)throughput; + (void)bsdf_eval; #endif } -ccl_device_inline void path_radiance_accum_background( - PathRadiance *L, - ccl_addr_space PathState *state, - float3 throughput, - float3 value) +ccl_device_inline void path_radiance_accum_background(PathRadiance *L, + ccl_addr_space PathState *state, + float3 throughput, + float3 value) { #ifdef __SHADOW_TRICKS__ - if(state->flag & PATH_RAY_STORE_SHADOW_INFO) { - L->path_total += throughput * value; - L->path_total_shaded += throughput * value * L->shadow_transparency; + if (state->flag & PATH_RAY_STORE_SHADOW_INFO) { + L->path_total += throughput * value; + L->path_total_shaded += throughput * value * L->shadow_transparency; - if(state->flag & PATH_RAY_SHADOW_CATCHER) { - return; - } - } + if (state->flag & PATH_RAY_SHADOW_CATCHER) { + return; + } + } #endif #ifdef __PASSES__ - if(L->use_light_pass) { - if(state->flag & PATH_RAY_TRANSPARENT_BACKGROUND) - L->background += throughput*value; - else if(state->bounce == 1) - L->direct_emission += throughput*value; - else - L->indirect += throughput*value; - } - else -#endif - { - L->emission += throughput*value; - } + if (L->use_light_pass) { + if (state->flag & PATH_RAY_TRANSPARENT_BACKGROUND) + L->background += throughput * value; + else if (state->bounce == 1) + L->direct_emission += throughput * value; + else + L->indirect += throughput * value; + } + else +#endif + { + L->emission += throughput * value; + } #ifdef __DENOISING_FEATURES__ - L->denoising_albedo += state->denoising_feature_weight * value; -#endif /* __DENOISING_FEATURES__ */ + L->denoising_albedo += state->denoising_feature_weight * value; +#endif /* __DENOISING_FEATURES__ */ } -ccl_device_inline void path_radiance_accum_transparent( - PathRadiance *L, - ccl_addr_space PathState *state, - float3 throughput) +ccl_device_inline void path_radiance_accum_transparent(PathRadiance *L, + ccl_addr_space PathState *state, + float3 throughput) { - L->transparent += average(throughput); + L->transparent += average(throughput); } #ifdef __SHADOW_TRICKS__ -ccl_device_inline void path_radiance_accum_shadowcatcher( - PathRadiance *L, - float3 throughput, - float3 background) +ccl_device_inline void path_radiance_accum_shadowcatcher(PathRadiance *L, + float3 throughput, + float3 background) { - L->shadow_throughput += average(throughput); - L->shadow_background_color += throughput * background; - L->has_shadow_catcher = 1; + L->shadow_throughput += average(throughput); + L->shadow_background_color += throughput * background; + L->has_shadow_catcher = 1; } #endif ccl_device_inline void path_radiance_sum_indirect(PathRadiance *L) { #ifdef __PASSES__ - /* this division is a bit ugly, but means we only have to keep track of - * only a single throughput further along the path, here we recover just - * the indirect path that is not influenced by any particular BSDF type */ - if(L->use_light_pass) { - L->direct_emission = safe_divide_color(L->direct_emission, L->state.direct); - L->direct_diffuse += L->state.diffuse*L->direct_emission; - L->direct_glossy += L->state.glossy*L->direct_emission; - L->direct_transmission += L->state.transmission*L->direct_emission; - L->direct_subsurface += L->state.subsurface*L->direct_emission; - L->direct_scatter += L->state.scatter*L->direct_emission; - - L->indirect = safe_divide_color(L->indirect, L->state.direct); - L->indirect_diffuse += L->state.diffuse*L->indirect; - L->indirect_glossy += L->state.glossy*L->indirect; - L->indirect_transmission += L->state.transmission*L->indirect; - L->indirect_subsurface += L->state.subsurface*L->indirect; - L->indirect_scatter += L->state.scatter*L->indirect; - } + /* this division is a bit ugly, but means we only have to keep track of + * only a single throughput further along the path, here we recover just + * the indirect path that is not influenced by any particular BSDF type */ + if (L->use_light_pass) { + L->direct_emission = safe_divide_color(L->direct_emission, L->state.direct); + L->direct_diffuse += L->state.diffuse * L->direct_emission; + L->direct_glossy += L->state.glossy * L->direct_emission; + L->direct_transmission += L->state.transmission * L->direct_emission; + L->direct_subsurface += L->state.subsurface * L->direct_emission; + L->direct_scatter += L->state.scatter * L->direct_emission; + + L->indirect = safe_divide_color(L->indirect, L->state.direct); + L->indirect_diffuse += L->state.diffuse * L->indirect; + L->indirect_glossy += L->state.glossy * L->indirect; + L->indirect_transmission += L->state.transmission * L->indirect; + L->indirect_subsurface += L->state.subsurface * L->indirect; + L->indirect_scatter += L->state.scatter * L->indirect; + } #endif } ccl_device_inline void path_radiance_reset_indirect(PathRadiance *L) { #ifdef __PASSES__ - if(L->use_light_pass) { - L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->state.glossy = make_float3(0.0f, 0.0f, 0.0f); - L->state.transmission = make_float3(0.0f, 0.0f, 0.0f); - L->state.subsurface = make_float3(0.0f, 0.0f, 0.0f); - L->state.scatter = make_float3(0.0f, 0.0f, 0.0f); + if (L->use_light_pass) { + L->state.diffuse = make_float3(0.0f, 0.0f, 0.0f); + L->state.glossy = make_float3(0.0f, 0.0f, 0.0f); + L->state.transmission = make_float3(0.0f, 0.0f, 0.0f); + L->state.subsurface = make_float3(0.0f, 0.0f, 0.0f); + L->state.scatter = make_float3(0.0f, 0.0f, 0.0f); - L->direct_emission = make_float3(0.0f, 0.0f, 0.0f); - L->indirect = make_float3(0.0f, 0.0f, 0.0f); - } + L->direct_emission = make_float3(0.0f, 0.0f, 0.0f); + L->indirect = make_float3(0.0f, 0.0f, 0.0f); + } #endif } -ccl_device_inline void path_radiance_copy_indirect(PathRadiance *L, - const PathRadiance *L_src) +ccl_device_inline void path_radiance_copy_indirect(PathRadiance *L, const PathRadiance *L_src) { #ifdef __PASSES__ - if(L->use_light_pass) { - L->state = L_src->state; + if (L->use_light_pass) { + L->state = L_src->state; - L->direct_emission = L_src->direct_emission; - L->indirect = L_src->indirect; - } + L->direct_emission = L_src->direct_emission; + L->indirect = L_src->indirect; + } #endif } @@ -557,213 +550,219 @@ ccl_device_inline void path_radiance_sum_shadowcatcher(KernelGlobals *kg, float3 *L_sum, float *alpha) { - /* Calculate current shadow of the path. */ - float path_total = average(L->path_total); - float shadow; - - if(UNLIKELY(!isfinite_safe(path_total))) { - kernel_assert(!"Non-finite total radiance along the path"); - shadow = 0.0f; - } - else if(path_total == 0.0f) { - shadow = L->shadow_transparency; - } - else { - float path_total_shaded = average(L->path_total_shaded); - shadow = path_total_shaded / path_total; - } - - /* Calculate final light sum and transparency for shadow catcher object. */ - if(kernel_data.background.transparent) { - *alpha -= L->shadow_throughput * shadow; - } - else { - L->shadow_background_color *= shadow; - *L_sum += L->shadow_background_color; - } + /* Calculate current shadow of the path. */ + float path_total = average(L->path_total); + float shadow; + + if (UNLIKELY(!isfinite_safe(path_total))) { + kernel_assert(!"Non-finite total radiance along the path"); + shadow = 0.0f; + } + else if (path_total == 0.0f) { + shadow = L->shadow_transparency; + } + else { + float path_total_shaded = average(L->path_total_shaded); + shadow = path_total_shaded / path_total; + } + + /* Calculate final light sum and transparency for shadow catcher object. */ + if (kernel_data.background.transparent) { + *alpha -= L->shadow_throughput * shadow; + } + else { + L->shadow_background_color *= shadow; + *L_sum += L->shadow_background_color; + } } #endif -ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, PathRadiance *L, float *alpha) +ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, + PathRadiance *L, + float *alpha) { - float3 L_sum; - /* Light Passes are used */ + float3 L_sum; + /* Light Passes are used */ #ifdef __PASSES__ - float3 L_direct, L_indirect; - float clamp_direct = kernel_data.integrator.sample_clamp_direct; - float clamp_indirect = kernel_data.integrator.sample_clamp_indirect; - if(L->use_light_pass) { - path_radiance_sum_indirect(L); - - L_direct = L->direct_diffuse + L->direct_glossy + L->direct_transmission + L->direct_subsurface + L->direct_scatter + L->emission; - L_indirect = L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission + L->indirect_subsurface + L->indirect_scatter; - - if(!kernel_data.background.transparent) - L_direct += L->background; - - L_sum = L_direct + L_indirect; - float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z); - - /* Reject invalid value */ - if(!isfinite_safe(sum)) { - kernel_assert(!"Non-finite sum in path_radiance_clamp_and_sum!"); - L_sum = make_float3(0.0f, 0.0f, 0.0f); - - L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f); - L->direct_scatter = make_float3(0.0f, 0.0f, 0.0f); - - L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f); - L->indirect_scatter = make_float3(0.0f, 0.0f, 0.0f); - - L->emission = make_float3(0.0f, 0.0f, 0.0f); - } - - /* Clamp direct and indirect samples */ -#ifdef __CLAMP_SAMPLE__ - else if(sum > clamp_direct || sum > clamp_indirect) { - float scale; - - /* Direct */ - float sum_direct = fabsf(L_direct.x) + fabsf(L_direct.y) + fabsf(L_direct.z); - if(sum_direct > clamp_direct) { - scale = clamp_direct/sum_direct; - L_direct *= scale; - - L->direct_diffuse *= scale; - L->direct_glossy *= scale; - L->direct_transmission *= scale; - L->direct_subsurface *= scale; - L->direct_scatter *= scale; - L->emission *= scale; - L->background *= scale; - } - - /* Indirect */ - float sum_indirect = fabsf(L_indirect.x) + fabsf(L_indirect.y) + fabsf(L_indirect.z); - if(sum_indirect > clamp_indirect) { - scale = clamp_indirect/sum_indirect; - L_indirect *= scale; - - L->indirect_diffuse *= scale; - L->indirect_glossy *= scale; - L->indirect_transmission *= scale; - L->indirect_subsurface *= scale; - L->indirect_scatter *= scale; - } - - /* Sum again, after clamping */ - L_sum = L_direct + L_indirect; - } -#endif - } - - /* No Light Passes */ - else -#endif - { - L_sum = L->emission; - - /* Reject invalid value */ - float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z); - if(!isfinite_safe(sum)) { - kernel_assert(!"Non-finite final sum in path_radiance_clamp_and_sum!"); - L_sum = make_float3(0.0f, 0.0f, 0.0f); - } - } - - /* Compute alpha. */ - *alpha = 1.0f - L->transparent; - - /* Add shadow catcher contributions. */ + float3 L_direct, L_indirect; + float clamp_direct = kernel_data.integrator.sample_clamp_direct; + float clamp_indirect = kernel_data.integrator.sample_clamp_indirect; + if (L->use_light_pass) { + path_radiance_sum_indirect(L); + + L_direct = L->direct_diffuse + L->direct_glossy + L->direct_transmission + + L->direct_subsurface + L->direct_scatter + L->emission; + L_indirect = L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission + + L->indirect_subsurface + L->indirect_scatter; + + if (!kernel_data.background.transparent) + L_direct += L->background; + + L_sum = L_direct + L_indirect; + float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z); + + /* Reject invalid value */ + if (!isfinite_safe(sum)) { + kernel_assert(!"Non-finite sum in path_radiance_clamp_and_sum!"); + L_sum = make_float3(0.0f, 0.0f, 0.0f); + + L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f); + L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f); + L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f); + L->direct_scatter = make_float3(0.0f, 0.0f, 0.0f); + + L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_scatter = make_float3(0.0f, 0.0f, 0.0f); + + L->emission = make_float3(0.0f, 0.0f, 0.0f); + } + + /* Clamp direct and indirect samples */ +# ifdef __CLAMP_SAMPLE__ + else if (sum > clamp_direct || sum > clamp_indirect) { + float scale; + + /* Direct */ + float sum_direct = fabsf(L_direct.x) + fabsf(L_direct.y) + fabsf(L_direct.z); + if (sum_direct > clamp_direct) { + scale = clamp_direct / sum_direct; + L_direct *= scale; + + L->direct_diffuse *= scale; + L->direct_glossy *= scale; + L->direct_transmission *= scale; + L->direct_subsurface *= scale; + L->direct_scatter *= scale; + L->emission *= scale; + L->background *= scale; + } + + /* Indirect */ + float sum_indirect = fabsf(L_indirect.x) + fabsf(L_indirect.y) + fabsf(L_indirect.z); + if (sum_indirect > clamp_indirect) { + scale = clamp_indirect / sum_indirect; + L_indirect *= scale; + + L->indirect_diffuse *= scale; + L->indirect_glossy *= scale; + L->indirect_transmission *= scale; + L->indirect_subsurface *= scale; + L->indirect_scatter *= scale; + } + + /* Sum again, after clamping */ + L_sum = L_direct + L_indirect; + } +# endif + } + + /* No Light Passes */ + else +#endif + { + L_sum = L->emission; + + /* Reject invalid value */ + float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z); + if (!isfinite_safe(sum)) { + kernel_assert(!"Non-finite final sum in path_radiance_clamp_and_sum!"); + L_sum = make_float3(0.0f, 0.0f, 0.0f); + } + } + + /* Compute alpha. */ + *alpha = 1.0f - L->transparent; + + /* Add shadow catcher contributions. */ #ifdef __SHADOW_TRICKS__ - if(L->has_shadow_catcher) { - path_radiance_sum_shadowcatcher(kg, L, &L_sum, alpha); - } -#endif /* __SHADOW_TRICKS__ */ + if (L->has_shadow_catcher) { + path_radiance_sum_shadowcatcher(kg, L, &L_sum, alpha); + } +#endif /* __SHADOW_TRICKS__ */ - return L_sum; + return L_sum; } -ccl_device_inline void path_radiance_split_denoising(KernelGlobals *kg, PathRadiance *L, float3 *noisy, float3 *clean) +ccl_device_inline void path_radiance_split_denoising(KernelGlobals *kg, + PathRadiance *L, + float3 *noisy, + float3 *clean) { #ifdef __PASSES__ - kernel_assert(L->use_light_pass); - - *clean = L->emission + L->background; - *noisy = L->direct_scatter + L->indirect_scatter; - -# define ADD_COMPONENT(flag, component) \ - if(kernel_data.film.denoising_flags & flag) \ - *clean += component; \ - else \ - *noisy += component; - - ADD_COMPONENT(DENOISING_CLEAN_DIFFUSE_DIR, L->direct_diffuse); - ADD_COMPONENT(DENOISING_CLEAN_DIFFUSE_IND, L->indirect_diffuse); - ADD_COMPONENT(DENOISING_CLEAN_GLOSSY_DIR, L->direct_glossy); - ADD_COMPONENT(DENOISING_CLEAN_GLOSSY_IND, L->indirect_glossy); - ADD_COMPONENT(DENOISING_CLEAN_TRANSMISSION_DIR, L->direct_transmission); - ADD_COMPONENT(DENOISING_CLEAN_TRANSMISSION_IND, L->indirect_transmission); - ADD_COMPONENT(DENOISING_CLEAN_SUBSURFACE_DIR, L->direct_subsurface); - ADD_COMPONENT(DENOISING_CLEAN_SUBSURFACE_IND, L->indirect_subsurface); + kernel_assert(L->use_light_pass); + + *clean = L->emission + L->background; + *noisy = L->direct_scatter + L->indirect_scatter; + +# define ADD_COMPONENT(flag, component) \ + if (kernel_data.film.denoising_flags & flag) \ + *clean += component; \ + else \ + *noisy += component; + + ADD_COMPONENT(DENOISING_CLEAN_DIFFUSE_DIR, L->direct_diffuse); + ADD_COMPONENT(DENOISING_CLEAN_DIFFUSE_IND, L->indirect_diffuse); + ADD_COMPONENT(DENOISING_CLEAN_GLOSSY_DIR, L->direct_glossy); + ADD_COMPONENT(DENOISING_CLEAN_GLOSSY_IND, L->indirect_glossy); + ADD_COMPONENT(DENOISING_CLEAN_TRANSMISSION_DIR, L->direct_transmission); + ADD_COMPONENT(DENOISING_CLEAN_TRANSMISSION_IND, L->indirect_transmission); + ADD_COMPONENT(DENOISING_CLEAN_SUBSURFACE_DIR, L->direct_subsurface); + ADD_COMPONENT(DENOISING_CLEAN_SUBSURFACE_IND, L->indirect_subsurface); # undef ADD_COMPONENT #else - *noisy = L->emission; - *clean = make_float3(0.0f, 0.0f, 0.0f); + *noisy = L->emission; + *clean = make_float3(0.0f, 0.0f, 0.0f); #endif #ifdef __SHADOW_TRICKS__ - if(L->has_shadow_catcher) { - *noisy += L->shadow_background_color; - } + if (L->has_shadow_catcher) { + *noisy += L->shadow_background_color; + } #endif - *noisy = ensure_finite3(*noisy); - *clean = ensure_finite3(*clean); + *noisy = ensure_finite3(*noisy); + *clean = ensure_finite3(*clean); } ccl_device_inline void path_radiance_accum_sample(PathRadiance *L, PathRadiance *L_sample) { #ifdef __SPLIT_KERNEL__ # define safe_float3_add(f, v) \ - do { \ - ccl_global float *p = (ccl_global float*)(&(f)); \ - atomic_add_and_fetch_float(p+0, (v).x); \ - atomic_add_and_fetch_float(p+1, (v).y); \ - atomic_add_and_fetch_float(p+2, (v).z); \ - } while(0) -# define safe_float_add(f, v) \ - atomic_add_and_fetch_float(&(f), (v)) + do { \ + ccl_global float *p = (ccl_global float *)(&(f)); \ + atomic_add_and_fetch_float(p + 0, (v).x); \ + atomic_add_and_fetch_float(p + 1, (v).y); \ + atomic_add_and_fetch_float(p + 2, (v).z); \ + } while (0) +# define safe_float_add(f, v) atomic_add_and_fetch_float(&(f), (v)) #else # define safe_float3_add(f, v) (f) += (v) # define safe_float_add(f, v) (f) += (v) -#endif /* __SPLIT_KERNEL__ */ +#endif /* __SPLIT_KERNEL__ */ #ifdef __PASSES__ - safe_float3_add(L->direct_diffuse, L_sample->direct_diffuse); - safe_float3_add(L->direct_glossy, L_sample->direct_glossy); - safe_float3_add(L->direct_transmission, L_sample->direct_transmission); - safe_float3_add(L->direct_subsurface, L_sample->direct_subsurface); - safe_float3_add(L->direct_scatter, L_sample->direct_scatter); - - safe_float3_add(L->indirect_diffuse, L_sample->indirect_diffuse); - safe_float3_add(L->indirect_glossy, L_sample->indirect_glossy); - safe_float3_add(L->indirect_transmission, L_sample->indirect_transmission); - safe_float3_add(L->indirect_subsurface, L_sample->indirect_subsurface); - safe_float3_add(L->indirect_scatter, L_sample->indirect_scatter); - - safe_float3_add(L->background, L_sample->background); - safe_float3_add(L->ao, L_sample->ao); - safe_float3_add(L->shadow, L_sample->shadow); - safe_float_add(L->mist, L_sample->mist); -#endif /* __PASSES__ */ - safe_float3_add(L->emission, L_sample->emission); + safe_float3_add(L->direct_diffuse, L_sample->direct_diffuse); + safe_float3_add(L->direct_glossy, L_sample->direct_glossy); + safe_float3_add(L->direct_transmission, L_sample->direct_transmission); + safe_float3_add(L->direct_subsurface, L_sample->direct_subsurface); + safe_float3_add(L->direct_scatter, L_sample->direct_scatter); + + safe_float3_add(L->indirect_diffuse, L_sample->indirect_diffuse); + safe_float3_add(L->indirect_glossy, L_sample->indirect_glossy); + safe_float3_add(L->indirect_transmission, L_sample->indirect_transmission); + safe_float3_add(L->indirect_subsurface, L_sample->indirect_subsurface); + safe_float3_add(L->indirect_scatter, L_sample->indirect_scatter); + + safe_float3_add(L->background, L_sample->background); + safe_float3_add(L->ao, L_sample->ao); + safe_float3_add(L->shadow, L_sample->shadow); + safe_float_add(L->mist, L_sample->mist); +#endif /* __PASSES__ */ + safe_float3_add(L->emission, L_sample->emission); #undef safe_float_add #undef safe_float3_add |