diff options
author | Thomas Dinges <blender@dingto.org> | 2014-08-05 03:32:35 +0400 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2014-08-05 03:32:35 +0400 |
commit | 771d2f7a24252942e6dfc0e94ae0a1316a910dbf (patch) | |
tree | 17da7c1789e213d600af7b38596cda0a1f6533f8 | |
parent | 28f8e253667d6f8cc598990b0338160c0c513939 (diff) |
Cycles: Optimize Equi-Angular sampling using binary range search.
Patch by Lukas Tönne and myself.
-rw-r--r-- | intern/cycles/kernel/kernel_volume.h | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h index b13168cfa19..8b1ae6330c4 100644 --- a/intern/cycles/kernel/kernel_volume.h +++ b/intern/cycles/kernel/kernel_volume.h @@ -848,15 +848,33 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter( float3 step_pdf_distance = make_float3(1.0f, 1.0f, 1.0f); if(segment->numsteps > 1) { - /* todo: optimize using binary search */ float3 prev_cdf_distance = make_float3(0.0f, 0.0f, 0.0f); - for(int i = 0; i < segment->numsteps-1; i++, step++) { - if(sample_t < step->t) + int numsteps = segment->numsteps; + int high = numsteps - 1; + int low = 0; + int mid; + + while(low < high) { + mid = (low + high) >> 1; + + if(sample_t < step[mid].t) + high = mid; + else if(sample_t >= step[mid + 1].t) + low = mid + 1; + else { + /* found our interval in step[mid] .. step[mid+1] */ + prev_t = step[mid].t; + prev_cdf_distance = step[mid].cdf_distance; + step += mid+1; break; + } + } - prev_t = step->t; - prev_cdf_distance = step->cdf_distance; + if(low >= numsteps - 1) { + prev_t = step[numsteps - 1].t; + prev_cdf_distance = step[numsteps-1].cdf_distance; + step += numsteps - 1; } /* pdf for picking step with distance sampling */ |