From c10c22737942e0f7c51103e056c4b676d7ee078e Mon Sep 17 00:00:00 2001 From: Rye Mutt <rye@alchemyviewer.org> Date: Thu, 28 Sep 2023 10:52:50 -0400 Subject: [PATCH] Enforce a minimum roughness to 0.045 in PBR shaders to avoid div by zero and for consistency with Substance and UE/Unity --- .../app_settings/shaders/class1/deferred/deferredUtil.glsl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 1dd697b43d6..f0a15cdf882 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -72,6 +72,8 @@ uniform vec2 screen_res; const float M_PI = 3.14159265; const float ONE_OVER_PI = 0.3183098861; +const float MIN_PBR_ROUGHNESS = 0.045; + vec3 srgb_to_linear(vec3 cs); vec3 atmosFragLightingLinear(vec3 light, vec3 additive, vec3 atten); @@ -489,7 +491,7 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor, out vec3 specContrib) //specular contribution (exposed to alpha shaders to calculate "glare") { // make sure specular highlights from punctual lights don't fall off of polished surfaces - perceptualRoughness = max(perceptualRoughness, 8.0/255.0); + perceptualRoughness = max(perceptualRoughness, MIN_PBR_ROUGHNESS); float alphaRoughness = perceptualRoughness * perceptualRoughness; @@ -566,6 +568,7 @@ void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v, vec3 norm, float perceptualRoughness, vec3 light_dir, vec3 sunlit, float scol, vec3 radiance, vec3 irradiance, vec3 colorEmissive, float ao, vec3 additive, vec3 atten, out vec3 specContrib) { + perceptualRoughness = max(perceptualRoughness, MIN_PBR_ROUGHNESS); vec3 color = vec3(0); float NdotV = clamp(abs(dot(norm, v)), 0.001, 1.0); -- GitLab