From fd65d4bcd7c1098b0738065de5caaa9bf5234e7a Mon Sep 17 00:00:00 2001 From: Marco Buono Date: Sun, 16 Apr 2023 17:54:13 -0300 Subject: [PATCH] Make refraction math for environment map more accurate --- crates/bevy_pbr/src/render/pbr_functions.wgsl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/bevy_pbr/src/render/pbr_functions.wgsl b/crates/bevy_pbr/src/render/pbr_functions.wgsl index 81de84e388..9ed2e49bf5 100644 --- a/crates/bevy_pbr/src/render/pbr_functions.wgsl +++ b/crates/bevy_pbr/src/render/pbr_functions.wgsl @@ -341,10 +341,16 @@ fn pbr( // // NdotV = 1.0; // f_ab = vec2(0.1) - // R = -refract(in.V, -in.N, 1.0 / ior) + // R = T // see definition below // F0 = vec3(0.16) // occlusion = 1.0 - let transmitted_environment_light = environment_map_light(perceptual_roughness, roughness, diffuse_transmissive_color, 1.0, vec2(0.1), -in.N, -refract(in.V, -in.N, 1.0 / ior), vec3(0.16)); + + let T = -normalize( + in.V + // start with view vector at entry point + refract(in.V, -in.N, 1.0 / ior) * thickness // add refracted vector scaled by thickness, towards exit point + ); // normalize to find exit point view vector + + let transmitted_environment_light = environment_map_light(perceptual_roughness, roughness, diffuse_transmissive_color, 1.0, vec2(0.1), -in.N, T, vec3(0.16)); transmitted_light += transmitted_environment_light.diffuse; transmitted_environment_light_specular = transmitted_environment_light.specular; }