From 94291cf5699cc1b9e639c23d664d40abf5bb1560 Mon Sep 17 00:00:00 2001 From: Elabajaba Date: Sat, 1 Jul 2023 17:29:13 -0400 Subject: [PATCH] Fix black spots appearing due to NANs when SSAO is enabled (#8926) # Objective Fixes https://github.com/bevyengine/bevy/issues/8925 ## Solution ~~Clamp the bad values.~~ Normalize the prepass normals when we get them in the `prepass_normal()` function. ## More Info The issue is that NdotV is sometimes very slightly greater than 1 (maybe FP rounding issues?), which caused `F_Schlick()` to return NANs in `pow(1.0 - NdotV, 5.0)` (call stack looked like`pbr()` -> `directional_light()` -> `Fd_Burley()` -> `F_Schlick()`) --- crates/bevy_pbr/src/prepass/prepass_utils.wgsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_pbr/src/prepass/prepass_utils.wgsl b/crates/bevy_pbr/src/prepass/prepass_utils.wgsl index d4e9b5992764a..f36e373684934 100644 --- a/crates/bevy_pbr/src/prepass/prepass_utils.wgsl +++ b/crates/bevy_pbr/src/prepass/prepass_utils.wgsl @@ -20,7 +20,7 @@ fn prepass_normal(frag_coord: vec4, sample_index: u32) -> vec3 { #else let normal_sample = textureLoad(view_bindings::normal_prepass_texture, vec2(frag_coord.xy), 0); #endif // MULTISAMPLED - return normal_sample.xyz * 2.0 - vec3(1.0); + return normalize(normal_sample.xyz * 2.0 - vec3(1.0)); } #endif // NORMAL_PREPASS