[Bf-blender-cvs] [f6305047f44] gsoc-2018-many-light-sampling: Cycles: Light tree split heuristic fix
Erik Englesson
noreply at git.blender.org
Fri Aug 3 17:32:08 CEST 2018
Commit: f6305047f44bf3168b1da8601307d78015ad8f65
Author: Erik Englesson
Date: Thu Aug 2 10:43:49 2018 +0200
Branches: gsoc-2018-many-light-sampling
https://developer.blender.org/rBf6305047f44bf3168b1da8601307d78015ad8f65
Cycles: Light tree split heuristic fix
Doubles are no longer needed in the split heuristic
calculations.
===================================================================
M intern/cycles/kernel/kernel_path_surface.h
===================================================================
diff --git a/intern/cycles/kernel/kernel_path_surface.h b/intern/cycles/kernel/kernel_path_surface.h
index b4f77cdef02..efc564e24e9 100644
--- a/intern/cycles/kernel/kernel_path_surface.h
+++ b/intern/cycles/kernel/kernel_path_surface.h
@@ -49,10 +49,10 @@ ccl_device void accum_light_contribution(KernelGlobals *kg,
ccl_device bool split(KernelGlobals *kg, float3 P, int node_offset)
{
/* early exists if never/always splitting */
- const double threshold = (double)kernel_data.integrator.splitting_threshold;
- if(threshold == 0.0){
+ const float threshold = kernel_data.integrator.splitting_threshold;
+ if(threshold == 0.0f){
return false;
- } else if(threshold == 1.0){
+ } else if(threshold == 1.0f){
return true;
}
@@ -64,40 +64,38 @@ ccl_device bool split(KernelGlobals *kg, float3 P, int node_offset)
/* if P is inside bounding sphere then split */
const float3 centroid = 0.5f * (bboxMax + bboxMin);
- const double radius_squared = (double)len_squared(bboxMax - centroid);
- const double dist_squared = (double)len_squared(centroid - P);
+ const float radius_squared = len_squared(bboxMax - centroid);
+ const float dist_squared = len_squared(centroid - P);
+
if(dist_squared <= radius_squared){
return true;
}
/* eq. 8 & 9 */
- /* observed precision issues and issues with overflow of num_emitters_squared.
- * using doubles to fix this for now. */
/* Interval the distance can be in: [a,b] */
- const double radius = sqrt(radius_squared);
- const double dist = sqrt(dist_squared);
- const double a = dist - radius;
- const double b = dist + radius;
-
- const double g_mean = 1.0 / (a * b);
- const double g_mean_squared = g_mean * g_mean;
- const double a3 = a * a * a;
- const double b3 = b * b * b;
- const double g_variance = (b3 - a3) / (3.0 * (b - a) * a3 * b3) -
+ const float radius = sqrt(radius_squared);
+ const float dist = sqrt(dist_squared);
+ const float a = dist - radius;
+ const float b = dist + radius;
+
+ const float g_mean = 1.0f / (a * b);
+ const float g_mean_squared = g_mean * g_mean;
+ const float a3 = a * a * a;
+ const float b3 = b * b * b;
+ const float g_variance = (b3 - a3) / (3.0f * (b - a) * a3 * b3) -
g_mean_squared;
/* eq. 10 */
const float4 node0 = kernel_tex_fetch(__light_tree_nodes, node_offset );
const float4 node3 = kernel_tex_fetch(__light_tree_nodes, node_offset + 3);
- const double energy = (double)node0.x;
- const double e_variance = (double)node3.w;
- const double num_emitters = (double)__float_as_int(node0.w);
-
- const double num_emitters_squared = num_emitters * num_emitters;
- const double e_mean = energy / num_emitters;
- const double e_mean_squared = e_mean * e_mean;
- const double variance = (e_variance * (g_variance + g_mean_squared) +
+ const float energy = node0.x;
+ const float e_variance = node3.w;
+ const float num_emitters = (float)__float_as_int(node0.w);
+ const float num_emitters_squared = num_emitters * num_emitters;
+ const float e_mean = energy / num_emitters;
+ const float e_mean_squared = e_mean * e_mean;
+ const float variance = (e_variance * (g_variance + g_mean_squared) +
e_mean_squared * g_variance) * num_emitters_squared;
/*
* If I run into further precision issues
@@ -112,7 +110,7 @@ ccl_device bool split(KernelGlobals *kg, float3 P, int node_offset)
* */
/* normalize */
- const double variance_normalized = sqrt(sqrt( 1.0 / (1.0 + sqrt(variance))));
+ const float variance_normalized = sqrt(sqrt( 1.0f / (1.0f + sqrt(variance))));
return variance_normalized < threshold;
}
More information about the Bf-blender-cvs
mailing list