Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Werner <swerner@smithmicro.com>2015-11-20 19:44:19 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-11-26 12:59:58 +0300
commitc8a041f4895bbffc3efbede9c6003961cd59efaa (patch)
tree781f78f32e8570abe8ded334228e54fc372b8faf /intern/cycles/kernel/kernel_emission.h
parent35cf545e3a9018650f7b529aececb88072974083 (diff)
Fix T46760: Branched Path Tracing converges to different result than plain Path Tracing
Multiple importance sampling for branched path tracing light samples needs to be calculated separately per BSDF, not with Veach's one sample model.
Diffstat (limited to 'intern/cycles/kernel/kernel_emission.h')
-rw-r--r--intern/cycles/kernel/kernel_emission.h20
1 files changed, 10 insertions, 10 deletions
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index de9e8d77ec8..3863cf221c5 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -99,23 +99,23 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd,
return false;
/* evaluate BSDF at shading point */
- float bsdf_pdf;
#ifdef __VOLUME__
if(ccl_fetch(sd, prim) != PRIM_NONE)
- shader_bsdf_eval(kg, sd, ls->D, eval, &bsdf_pdf);
- else
+ shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS);
+ else {
+ float bsdf_pdf;
shader_volume_phase_eval(kg, sd, ls->D, eval, &bsdf_pdf);
+ if(ls->shader & SHADER_USE_MIS) {
+ /* Multiple importance sampling. */
+ float mis_weight = power_heuristic(ls->pdf, bsdf_pdf);
+ light_eval *= mis_weight;
+ }
+ }
#else
- shader_bsdf_eval(kg, sd, ls->D, eval, &bsdf_pdf);
+ shader_bsdf_eval(kg, sd, ls->D, eval, ls->pdf, ls->shader & SHADER_USE_MIS);
#endif
- if(ls->shader & SHADER_USE_MIS) {
- /* multiple importance sampling */
- float mis_weight = power_heuristic(ls->pdf, bsdf_pdf);
- light_eval *= mis_weight;
- }
-
bsdf_eval_mul(eval, light_eval/ls->pdf);
#ifdef __PASSES__