浏览代码

GPULightmapper: prevent loop with max iterations

In case the calculation of the delta contained infinity values (division by
zero), than later the calculation of the next cell failed as the infinity value
was multiplied by zero which resulted in a nan. The nan-value caused that the
next cell was equal to the current cell which resulted in an end-less loop,
which only terminates by the maximum iterations protection.

This is solved by replacing infinity with grid_size which acts as infinity.
William Deurwaarder 4 年之前
父节点
当前提交
f3f64389ca
共有 1 个文件被更改,包括 1 次插入1 次删除
  1. 1 1
      modules/lightmapper_rd/lm_compute.glsl

+ 1 - 1
modules/lightmapper_rd/lm_compute.glsl

@@ -148,7 +148,7 @@ uint trace_ray(vec3 p_from, vec3 p_to
 	ivec3 icell = ivec3(from_cell);
 	ivec3 icell = ivec3(from_cell);
 	ivec3 iendcell = ivec3(to_cell);
 	ivec3 iendcell = ivec3(to_cell);
 	vec3 dir_cell = normalize(rel_cell);
 	vec3 dir_cell = normalize(rel_cell);
-	vec3 delta = abs(1.0 / dir_cell); //vec3(length(rel_cell)) / rel_cell);
+	vec3 delta = min(abs(1.0 / dir_cell), params.grid_size); // use params.grid_size as max to prevent infinity values
 	ivec3 step = ivec3(sign(rel_cell));
 	ivec3 step = ivec3(sign(rel_cell));
 	vec3 side = (sign(rel_cell) * (vec3(icell) - from_cell) + (sign(rel_cell) * 0.5) + 0.5) * delta;
 	vec3 side = (sign(rel_cell) * (vec3(icell) - from_cell) + (sign(rel_cell) * 0.5) + 0.5) * delta;