From 9a46ecf52661081f6785dc0eea4d82bc5342fd7f Mon Sep 17 00:00:00 2001 From: Joey de Vries Date: Sun, 13 Dec 2020 13:53:56 +0100 Subject: [PATCH] Prevent 1.0 - cosTheta from becoming negative due to small FP inaccuracies. This can cause NaNs otherwise. --- src/6.pbr/1.1.lighting/1.1.pbr.fs | 2 +- src/6.pbr/1.2.lighting_textured/1.2.pbr.fs | 2 +- src/6.pbr/2.1.1.ibl_irradiance_conversion/2.1.1.pbr.fs | 7 +------ src/6.pbr/2.1.2.ibl_irradiance/2.1.2.pbr.fs | 2 +- src/6.pbr/2.2.1.ibl_specular/2.2.1.pbr.fs | 4 ++-- src/6.pbr/2.2.2.ibl_specular_textured/2.2.2.pbr.fs | 6 +++--- 6 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/6.pbr/1.1.lighting/1.1.pbr.fs b/src/6.pbr/1.1.lighting/1.1.pbr.fs index e014bb7..b5242e5 100644 --- a/src/6.pbr/1.1.lighting/1.1.pbr.fs +++ b/src/6.pbr/1.1.lighting/1.1.pbr.fs @@ -55,7 +55,7 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) // ---------------------------------------------------------------------------- vec3 fresnelSchlick(float cosTheta, vec3 F0) { - return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); + return F0 + (1.0 - F0) * pow(max(1.0 - cosTheta, 0.0), 5.0); } // ---------------------------------------------------------------------------- void main() diff --git a/src/6.pbr/1.2.lighting_textured/1.2.pbr.fs b/src/6.pbr/1.2.lighting_textured/1.2.pbr.fs index 04bc3f6..950594e 100644 --- a/src/6.pbr/1.2.lighting_textured/1.2.pbr.fs +++ b/src/6.pbr/1.2.lighting_textured/1.2.pbr.fs @@ -77,7 +77,7 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) // ---------------------------------------------------------------------------- vec3 fresnelSchlick(float cosTheta, vec3 F0) { - return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); + return F0 + (1.0 - F0) * pow(max(1.0 - cosTheta, 0.0), 5.0); } // ---------------------------------------------------------------------------- void main() diff --git a/src/6.pbr/2.1.1.ibl_irradiance_conversion/2.1.1.pbr.fs b/src/6.pbr/2.1.1.ibl_irradiance_conversion/2.1.1.pbr.fs index fdd2ec4..49ad11f 100644 --- a/src/6.pbr/2.1.1.ibl_irradiance_conversion/2.1.1.pbr.fs +++ b/src/6.pbr/2.1.1.ibl_irradiance_conversion/2.1.1.pbr.fs @@ -55,14 +55,9 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) // ---------------------------------------------------------------------------- vec3 fresnelSchlick(float cosTheta, vec3 F0) { - return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); + return F0 + (1.0 - F0) * pow(max(1.0 - cosTheta, 0.0), 5.0); } // ---------------------------------------------------------------------------- -vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) -{ - return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - cosTheta, 5.0); -} -// ---------------------------------------------------------------------------- void main() { vec3 N = Normal; diff --git a/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.pbr.fs b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.pbr.fs index d7d1d02..1808885 100644 --- a/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.pbr.fs +++ b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.pbr.fs @@ -58,7 +58,7 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) // ---------------------------------------------------------------------------- vec3 fresnelSchlick(float cosTheta, vec3 F0) { - return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); + return F0 + (1.0 - F0) * pow(max(1.0 - cosTheta, 0.0), 5.0); } // ---------------------------------------------------------------------------- void main() diff --git a/src/6.pbr/2.2.1.ibl_specular/2.2.1.pbr.fs b/src/6.pbr/2.2.1.ibl_specular/2.2.1.pbr.fs index 945132f..9033c12 100644 --- a/src/6.pbr/2.2.1.ibl_specular/2.2.1.pbr.fs +++ b/src/6.pbr/2.2.1.ibl_specular/2.2.1.pbr.fs @@ -60,12 +60,12 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) // ---------------------------------------------------------------------------- vec3 fresnelSchlick(float cosTheta, vec3 F0) { - return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); + return F0 + (1.0 - F0) * pow(max(1.0 - cosTheta, 0.0), 5.0); } // ---------------------------------------------------------------------------- vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) { - return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - cosTheta, 5.0); + return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(max(1.0 - cosTheta, 0.0), 5.0); } // ---------------------------------------------------------------------------- void main() diff --git a/src/6.pbr/2.2.2.ibl_specular_textured/2.2.2.pbr.fs b/src/6.pbr/2.2.2.ibl_specular_textured/2.2.2.pbr.fs index 0d98d8d..7d3be29 100644 --- a/src/6.pbr/2.2.2.ibl_specular_textured/2.2.2.pbr.fs +++ b/src/6.pbr/2.2.2.ibl_specular_textured/2.2.2.pbr.fs @@ -82,13 +82,13 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) // ---------------------------------------------------------------------------- vec3 fresnelSchlick(float cosTheta, vec3 F0) { - return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); + return F0 + (1.0 - F0) * pow(max(1.0 - cosTheta, 0.0), 5.0); } // ---------------------------------------------------------------------------- vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) { - return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - cosTheta, 5.0); -} + return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(max(1.0 - cosTheta, 0.0), 5.0); +} // ---------------------------------------------------------------------------- void main() {