From 6af4af8608cf023c4c073f9866f979e3a83e97c0 Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 16 Jan 2023 14:22:10 -0800 Subject: [PATCH 1/2] Pass precomputed NdotV --- crates/bevy_pbr/src/render/pbr_ambient.wgsl | 13 ++++++------- crates/bevy_pbr/src/render/pbr_functions.wgsl | 3 +-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/crates/bevy_pbr/src/render/pbr_ambient.wgsl b/crates/bevy_pbr/src/render/pbr_ambient.wgsl index cb8ff6d4fbc9e..5f336f8771652 100644 --- a/crates/bevy_pbr/src/render/pbr_ambient.wgsl +++ b/crates/bevy_pbr/src/render/pbr_ambient.wgsl @@ -1,16 +1,15 @@ #define_import_path bevy_pbr::pbr_ambient fn ambient_light( - world_position: vec4, - world_normal: vec3, - V: vec3, - diffuse_color: vec3, - specular_color: vec3, + world_position: vec4, + world_normal: vec3, + V: vec3, + NdotV: f32, + diffuse_color: vec3, + specular_color: vec3, perceptual_roughness: f32, occlusion: f32, ) -> vec3 { - let NdotV = max(dot(world_normal, V), 0.0001); - let diffuse_ambient = EnvBRDFApprox(diffuse_color, 1.0, NdotV); let specular_ambient = EnvBRDFApprox(specular_color, perceptual_roughness, NdotV); diff --git a/crates/bevy_pbr/src/render/pbr_functions.wgsl b/crates/bevy_pbr/src/render/pbr_functions.wgsl index 8bfa3a5a93aa9..4e3bf3d8ea9e4 100644 --- a/crates/bevy_pbr/src/render/pbr_functions.wgsl +++ b/crates/bevy_pbr/src/render/pbr_functions.wgsl @@ -231,7 +231,7 @@ fn pbr( light_accum = light_accum + light_contrib * shadow; } - let ambient_contrib = ambient_light(in.world_position, in.N, in.V, diffuse_color, F0, perceptual_roughness, occlusion); + let ambient_contrib = ambient_light(in.world_position, in.N, in.V, NdotV, diffuse_color, F0, perceptual_roughness, occlusion); output_color = vec4( light_accum + ambient_contrib + emissive.rgb * output_color.a, @@ -264,4 +264,3 @@ fn dither(color: vec4, pos: vec2) -> vec4 { return vec4(color.rgb + screen_space_dither(pos.xy), color.a); } #endif - From fa88d767ad7a1fb843729d423b3ccec951acce2d Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Mon, 16 Jan 2023 14:24:22 -0800 Subject: [PATCH 2/2] Document NdotV vs N and V --- crates/bevy_pbr/src/render/pbr_ambient.wgsl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/bevy_pbr/src/render/pbr_ambient.wgsl b/crates/bevy_pbr/src/render/pbr_ambient.wgsl index 5f336f8771652..8ef380ac5a2f1 100644 --- a/crates/bevy_pbr/src/render/pbr_ambient.wgsl +++ b/crates/bevy_pbr/src/render/pbr_ambient.wgsl @@ -1,5 +1,7 @@ #define_import_path bevy_pbr::pbr_ambient +// A precomputed `NdotV` is provided because it is computed regardless, +// but `world_normal` and the view vector `V` are provided separately for more advanced uses. fn ambient_light( world_position: vec4, world_normal: vec3,