[Bf-blender-cvs] [32a5313] master: Cycles: Optimize Equi-Angular sampling using binary range search.

Thomas Dinges noreply at git.blender.org
Thu Aug 14 20:21:57 CEST 2014


Commit: 32a5313b41701a65b6cb588adef4f295989cd3f8
Author: Thomas Dinges
Date:   Thu Aug 14 20:21:36 2014 +0200
Branches: master
https://developer.blender.org/rB32a5313b41701a65b6cb588adef4f295989cd3f8

Cycles: Optimize Equi-Angular sampling using binary range search.

Patch by Lukas Tönne and myself.

===================================================================

M	intern/cycles/kernel/kernel_volume.h

===================================================================

diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h
index ed73ac8..9e78d43 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -853,15 +853,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 */




More information about the Bf-blender-cvs mailing list