Prevent 1.0 - cosTheta from becoming negative due to small FP inaccuracies. This can cause NaNs otherwise.

This commit is contained in:
Joey de Vries
2020-12-13 13:53:56 +01:00
parent d444d98da7
commit 9a46ecf526
6 changed files with 9 additions and 14 deletions

View File

@@ -55,7 +55,7 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
vec3 fresnelSchlick(float cosTheta, vec3 F0) 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() void main()

View File

@@ -77,7 +77,7 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
vec3 fresnelSchlick(float cosTheta, vec3 F0) 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() void main()

View File

@@ -55,14 +55,9 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
vec3 fresnelSchlick(float cosTheta, vec3 F0) 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() void main()
{ {
vec3 N = Normal; vec3 N = Normal;

View File

@@ -58,7 +58,7 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
vec3 fresnelSchlick(float cosTheta, vec3 F0) 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() void main()

View File

@@ -60,12 +60,12 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
vec3 fresnelSchlick(float cosTheta, vec3 F0) 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) 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() void main()

View File

@@ -82,13 +82,13 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
vec3 fresnelSchlick(float cosTheta, vec3 F0) 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) 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() void main()
{ {