瀏覽代碼

GPULightmapper: process rays to sky in all bounces as active

Before this change only rays to the sky (RAY_MISS) in the first bounce were
processed as active rays. This caused artifacts, areas were too light, when
more than one bounce were processed.

Now rays to the sky are processed as active rays for all bounces.
William Deurwaarder 4 年之前
父節點
當前提交
fbd95c3e53
共有 1 個文件被更改,包括 12 次插入10 次删除
  1. 12 10
      modules/lightmapper_rd/lm_compute.glsl

+ 12 - 10
modules/lightmapper_rd/lm_compute.glsl

@@ -420,20 +420,22 @@ void main() {
 
 			light = textureLod(sampler2DArray(source_light, linear_sampler), uvw, 0.0).rgb;
 			active_rays += 1.0;
-		} else if (trace_result == RAY_MISS && params.env_transform[0][3] == 0.0) { // Use env_transform[0][3] to indicate when we are computing the first bounce
-			// Did not hit a triangle, reach out for the sky
-			vec3 sky_dir = normalize(mat3(params.env_transform) * ray_dir);
+		} else if (trace_result == RAY_MISS) {
+			if (params.env_transform[0][3] == 0.0) { // Use env_transform[0][3] to indicate when we are computing the first bounce
+				// Did not hit a triangle, reach out for the sky
+				vec3 sky_dir = normalize(mat3(params.env_transform) * ray_dir);
 
-			vec2 st = vec2(
-					atan(sky_dir.x, sky_dir.z),
-					acos(sky_dir.y));
+				vec2 st = vec2(
+						atan(sky_dir.x, sky_dir.z),
+						acos(sky_dir.y));
 
-			if (st.x < 0.0)
-				st.x += PI * 2.0;
+				if (st.x < 0.0)
+					st.x += PI * 2.0;
 
-			st /= vec2(PI * 2.0, PI);
+				st /= vec2(PI * 2.0, PI);
 
-			light = textureLod(sampler2D(environment, linear_sampler), st, 0.0).rgb;
+				light = textureLod(sampler2D(environment, linear_sampler), st, 0.0).rgb;
+			}
 			active_rays += 1.0;
 		}