Skip to content

Commit

Permalink
Revert the change of the limit for interpolation of R0 with respect t…
Browse files Browse the repository at this point in the history
…o metallic and SSR

Commit 2c000cb changed the interpolation limits from (0.04, 1.0) to (0.04, 0.37). This is incorrect, as we want to have an F0 of 0.04 for dielectrics (materials with metalness of 0.0) and an F0 of 1.0 for metals.
The Schlick approximation uses an F0 of 0.04 for all dielectrics and it's good enough.
Having it lower than 1.0 leads to an incorrect application of the Fresnel effect for metals and leads to bugs like godotengine#79549
  • Loading branch information
mandryskowski authored and IntangibleMatter committed Aug 13, 2023
1 parent b17d4a2 commit 924a723
Showing 1 changed file with 3 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,9 @@ void main() {

// Schlick term.
float metallic = texelFetch(source_metallic, ssC << 1, 0).w;
float f0 = mix(0.04, 0.37, metallic); // The default value of R0 is 0.04 and the maximum value is considered to be Germanium with R0 value of 0.37
// F0 is the reflectance of normally incident light (perpendicular to the surface).
// Dielectric materials have a widely accepted default value of 0.04. We assume that metals reflect all light, so their F0 is 1.0.
float f0 = mix(0.04, 1.0, metallic);
float m = clamp(1.0 - dot(normal, -view_dir), 0.0, 1.0);
float m2 = m * m;
m = m2 * m2 * m; // pow(m,5)
Expand Down

0 comments on commit 924a723

Please sign in to comment.