diff options
author | Brecht Van Lommel <brecht@blender.org> | 2021-11-19 20:05:17 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2021-11-19 20:05:17 +0300 |
commit | 06a2e2b28ce890b82fcaeb4651ab0fc7cc034c01 (patch) | |
tree | 2711b1e1513fbeb3ff2122f23b128d928a14268a /intern/cycles/kernel | |
parent | ef687bd7c28510007b07478fcfe584826fc23e36 (diff) | |
parent | 1b686c60b5a7f7f7604d7ba5012aa5afa15f0d07 (diff) |
Merge branch 'blender-v3.0-release'
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/integrator/shade_volume.h | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/intern/cycles/kernel/integrator/shade_volume.h b/intern/cycles/kernel/integrator/shade_volume.h index eff1042bd59..8fc9351b3e3 100644 --- a/intern/cycles/kernel/integrator/shade_volume.h +++ b/intern/cycles/kernel/integrator/shade_volume.h @@ -259,6 +259,12 @@ ccl_device void volume_shadow_heterogeneous(KernelGlobals kg, /* Equi-angular sampling as in: * "Importance Sampling Techniques for Path Tracing in Participating Media" */ +/* Below this pdf we ignore samples, as they tend to lead to very long distances. + * This can cause performance issues with BVH traversal in OptiX, leading it to + * traverse many nodes. Since these contribute very little to the image, just ignore + * those samples. */ +# define VOLUME_SAMPLE_PDF_CUTOFF 1e-8f + ccl_device float volume_equiangular_sample(ccl_private const Ray *ccl_restrict ray, const float3 light_P, const float xi, @@ -433,7 +439,8 @@ ccl_device_forceinline void volume_integrate_step_scattering( /* Equiangular sampling for direct lighting. */ if (vstate.direct_sample_method == VOLUME_SAMPLE_EQUIANGULAR && !result.direct_scatter) { - if (result.direct_t >= vstate.start_t && result.direct_t <= vstate.end_t) { + if (result.direct_t >= vstate.start_t && result.direct_t <= vstate.end_t && + vstate.equiangular_pdf > VOLUME_SAMPLE_PDF_CUTOFF) { const float new_dt = result.direct_t - vstate.start_t; const float3 new_transmittance = volume_color_transmittance(coeff.sigma_t, new_dt); @@ -470,26 +477,28 @@ ccl_device_forceinline void volume_integrate_step_scattering( const float3 new_transmittance = volume_color_transmittance(coeff.sigma_t, new_dt); const float distance_pdf = dot(channel_pdf, coeff.sigma_t * new_transmittance); - /* throughput */ - result.indirect_scatter = true; - result.indirect_t = new_t; - result.indirect_throughput *= coeff.sigma_s * new_transmittance / distance_pdf; - shader_copy_volume_phases(&result.indirect_phases, sd); - - if (vstate.direct_sample_method != VOLUME_SAMPLE_EQUIANGULAR) { - /* If using distance sampling for direct light, just copy parameters - * of indirect light since we scatter at the same point then. */ - result.direct_scatter = true; - result.direct_t = result.indirect_t; - result.direct_throughput = result.indirect_throughput; - shader_copy_volume_phases(&result.direct_phases, sd); - - /* Multiple importance sampling. */ - if (vstate.use_mis) { - const float equiangular_pdf = volume_equiangular_pdf(ray, equiangular_light_P, new_t); - const float mis_weight = power_heuristic(vstate.distance_pdf * distance_pdf, - equiangular_pdf); - result.direct_throughput *= 2.0f * mis_weight; + if (vstate.distance_pdf * distance_pdf > VOLUME_SAMPLE_PDF_CUTOFF) { + /* throughput */ + result.indirect_scatter = true; + result.indirect_t = new_t; + result.indirect_throughput *= coeff.sigma_s * new_transmittance / distance_pdf; + shader_copy_volume_phases(&result.indirect_phases, sd); + + if (vstate.direct_sample_method != VOLUME_SAMPLE_EQUIANGULAR) { + /* If using distance sampling for direct light, just copy parameters + * of indirect light since we scatter at the same point then. */ + result.direct_scatter = true; + result.direct_t = result.indirect_t; + result.direct_throughput = result.indirect_throughput; + shader_copy_volume_phases(&result.direct_phases, sd); + + /* Multiple importance sampling. */ + if (vstate.use_mis) { + const float equiangular_pdf = volume_equiangular_pdf(ray, equiangular_light_P, new_t); + const float mis_weight = power_heuristic(vstate.distance_pdf * distance_pdf, + equiangular_pdf); + result.direct_throughput *= 2.0f * mis_weight; + } } } } |