17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-29 20:57:32 +01:00

Keep the contact shadow march and the traced reflections off NaN normals

This commit is contained in:
2026-10-29 19:04:57 +01:00
parent bcf2c14b20
commit 9bc9168230
3 changed files with 9 additions and 4 deletions

View File

@@ -82,7 +82,8 @@ float contact_shadow(vec3 light_dir, float raylength, float steps)
vec3 normal = normalize(f_normal);
if (dot(normal, position) > 0.0)
normal = -normal;
if (dot(normal, light_dir) <= 0.0)
// (not "<= 0.0": a model with a normal of zero length gives NaN here, and the march with it would fetch far out of the depth)
if (!(dot(normal, light_dir) > 0.0))
return 0.0;
vec2 size = vec2(textureSize(scene_depth, 0));
// the projection is perspective with the depth n / w (reverse z, infinite far plane): w is the distance along the axis
@@ -105,7 +106,7 @@ float contact_shadow(vec3 light_dir, float raylength, float steps)
vec2 coords = (clip.xy / clip.w) * 0.5 + 0.5;
if (any(lessThan(coords, vec2(0.0))) || any(greaterThan(coords, vec2(1.0))))
break;
float depth = texelFetch(scene_depth, min(ivec2(coords * size), ivec2(size) - 1), 0).r;
float depth = texelFetch(scene_depth, clamp(ivec2(coords * size), ivec2(0), ivec2(size) - 1), 0).r;
// nothing drawn there (the sky)
if (depth <= 0.0)
continue;

View File

@@ -86,7 +86,8 @@ float contact_shadow(vec3 light_dir, float raylength, float steps)
vec3 normal = normalize(f_normal);
if (dot(normal, position) > 0.0)
normal = -normal;
if (dot(normal, light_dir) <= 0.0)
// (not "<= 0.0": a model with a normal of zero length gives NaN here, and the march with it would fetch far out of the depth)
if (!(dot(normal, light_dir) > 0.0))
return 0.0;
vec2 size = vec2(textureSize(scene_depth, 0));
// the projection is perspective with the depth n / w (reverse z, infinite far plane): w is the distance along the axis
@@ -109,7 +110,7 @@ float contact_shadow(vec3 light_dir, float raylength, float steps)
vec2 coords = (clip.xy / clip.w) * 0.5 + 0.5;
if (any(lessThan(coords, vec2(0.0))) || any(greaterThan(coords, vec2(1.0))))
break;
float depth = texelFetch(scene_depth, min(ivec2(coords * size), ivec2(size) - 1), 0).r;
float depth = texelFetch(scene_depth, clamp(ivec2(coords * size), ivec2(0), ivec2(size) - 1), 0).r;
// nothing drawn there (the sky)
if (depth <= 0.0)
continue;

View File

@@ -165,6 +165,9 @@ vec4 rt_trace(vec3 position, vec3 normal, vec3 direction, float roughness)
if (dot(face, point) > 0.0)
face = -face;
vec3 ray = normalize(toworld * direction);
// a normal of zero length (a model without proper normals) gives NaN: a ray from such an origin is undefined
if (any(isnan(face)) || any(isnan(ray)))
return vec4(0.0);
vec3 origin = point + face * (0.02 + length(point) * 0.0005);
rayQueryEXT query;