diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-01-09 14:56:50 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-01-09 14:56:50 +0300 |
commit | ddabad2410c166d909f512c751235031805da33e (patch) | |
tree | a369f76fe259d2d2d89d8bcba9ecca266c6f0f19 /intern/cycles/kernel | |
parent | ff6ff90cbec72dea41f1a0f638d2334185095514 (diff) | |
parent | 1a6a80270dae82d5ce9bf1266476f7bf0fe1d714 (diff) |
Merge branch 'blender2.7'
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/kernel_volume.h | 12 | ||||
-rw-r--r-- | intern/cycles/kernel/split/kernel_subsurface_scatter.h | 9 |
2 files changed, 13 insertions, 8 deletions
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h index d6d283c42c5..1df50504434 100644 --- a/intern/cycles/kernel/kernel_volume.h +++ b/intern/cycles/kernel/kernel_volume.h @@ -383,18 +383,22 @@ ccl_device int kernel_volume_sample_channel(float3 albedo, float3 throughput, fl * Tracing". Matt Jen-Yuan Chiang, Peter Kutz, Brent Burley. SIGGRAPH 2016. */ float3 weights = fabs(throughput * albedo); float sum_weights = weights.x + weights.y + weights.z; + float3 weights_pdf; if(sum_weights > 0.0f) { - *pdf = weights/sum_weights; + weights_pdf = weights/sum_weights; } else { - *pdf = make_float3(1.0f/3.0f, 1.0f/3.0f, 1.0f/3.0f); + weights_pdf = make_float3(1.0f/3.0f, 1.0f/3.0f, 1.0f/3.0f); } - if(rand < pdf->x) { + *pdf = weights_pdf; + + /* OpenCL does not support -> on float3, so don't use pdf->x. */ + if(rand < weights_pdf.x) { return 0; } - else if(rand < pdf->x + pdf->y) { + else if(rand < weights_pdf.x + weights_pdf.y) { return 1; } else { diff --git a/intern/cycles/kernel/split/kernel_subsurface_scatter.h b/intern/cycles/kernel/split/kernel_subsurface_scatter.h index c51246fbc90..08769fe303b 100644 --- a/intern/cycles/kernel/split/kernel_subsurface_scatter.h +++ b/intern/cycles/kernel/split/kernel_subsurface_scatter.h @@ -47,6 +47,11 @@ ccl_device_noinline bool kernel_split_branched_path_subsurface_indirect_light_it if(!CLOSURE_IS_BSSRDF(sc->type)) continue; + /* Closure memory will be overwritten, so read required variables now. */ + Bssrdf *bssrdf = (Bssrdf *)sc; + ClosureType bssrdf_type = sc->type; + float bssrdf_roughness = bssrdf->roughness; + /* set up random number generator */ if(branched_state->ss_next_sample == 0 && branched_state->next_hit == 0 && branched_state->next_closure == 0 && branched_state->next_sample == 0) @@ -110,10 +115,6 @@ ccl_device_noinline bool kernel_split_branched_path_subsurface_indirect_light_it *bssrdf_sd = *sd; /* note: copy happens each iteration of inner loop, this is * important as the indirect path will write into bssrdf_sd */ - Bssrdf *bssrdf = (Bssrdf *)sc; - ClosureType bssrdf_type = sc->type; - float bssrdf_roughness = bssrdf->roughness; - LocalIntersection ss_isect_private = *ss_isect; subsurface_scatter_multi_setup(kg, &ss_isect_private, |