Browse Source

Fix an issue in the PBR shaders that was causing noise.

hdunderscore 9 years ago
parent
commit
42cbca8b26

+ 5 - 5
bin/CoreData/Shaders/GLSL/PBRDeferred.glsl

@@ -99,13 +99,13 @@ void PS()
     #endif
 
     vec3 toCamera = normalize(-worldPos);
-    vec3 lightVec = lightDir;
+    vec3 lightVec = normalize(lightDir);
 
     vec3 Hn = normalize(toCamera + lightVec);
-    float vdh = max(M_EPSILON, dot(toCamera, Hn));
-    float ndh = max(M_EPSILON, dot(normal, Hn));
-    float ndl = max(M_EPSILON, dot(normal, lightVec));
-    float ndv = max(M_EPSILON, dot(normal, toCamera));
+    float vdh = clamp(abs(dot(toCamera, Hn)), M_EPSILON, 1.0);
+    float ndh = clamp(abs(dot(normal, Hn)), M_EPSILON, 1.0);
+    float ndl = clamp(abs(dot(normal, lightVec)), M_EPSILON, 1.0);
+    float ndv = clamp(abs(dot(normal, toCamera)), M_EPSILON, 1.0);
 
     vec3 diffuseFactor = BurleyDiffuse(albedoInput.rgb, roughness, ndv, ndl, vdh);
     vec3 specularFactor = vec3(0,0,0);

+ 5 - 4
bin/CoreData/Shaders/GLSL/PBRLitSolid.glsl

@@ -178,12 +178,13 @@ void PS()
         #endif
 
         vec3 toCamera = normalize(cCameraPosPS - vWorldPos.xyz);
+        vec3 lightVec = normalize(lightDir);
 
         vec3 Hn = normalize(toCamera + lightDir);
-        float vdh = max(M_EPSILON, dot(toCamera, Hn));
-        float ndh = max(M_EPSILON, dot(normal, Hn));
-        float ndl = max(M_EPSILON, dot(normal, lightDir));
-        float ndv = max(M_EPSILON, dot(normal, toCamera));
+        float vdh = clamp(abs(dot(toCamera, Hn)), M_EPSILON, 1.0);
+        float ndh = clamp(abs(dot(normal, Hn)), M_EPSILON, 1.0);
+        float ndl = clamp(abs(dot(normal, lightVec)), M_EPSILON, 1.0);
+        float ndv = clamp(abs(dot(normal, toCamera)), M_EPSILON, 1.0);
 
         vec3 diffuseFactor = BurleyDiffuse(diffColor.rgb, roughness, ndv, ndl, vdh);
         vec3 specularFactor = vec3(0,0,0);

+ 4 - 4
bin/CoreData/Shaders/HLSL/PBRDeferred.hlsl

@@ -108,10 +108,10 @@ void PS(
     const float3 lightVec = normalize(lightDir);
 
     const float3 Hn = normalize(toCamera + lightVec);
-    const float vdh = max(M_EPSILON, dot(toCamera, Hn));
-    const float ndh = max(M_EPSILON, dot(normal, Hn));
-    const float ndl = max(M_EPSILON, dot(normal, lightVec));
-    const float ndv = max(M_EPSILON, dot(normal, toCamera));
+    const float vdh = clamp(abs(dot(toCamera, Hn)), M_EPSILON, 1.0);
+    const float ndh = clamp(abs(dot(normal, Hn)), M_EPSILON, 1.0);
+    const float ndl = clamp(abs(dot(normal, lightVec)), M_EPSILON, 1.0);
+    const float ndv = clamp(abs(dot(normal, toCamera)), M_EPSILON, 1.0);
 
     const float3 diffuseFactor = BurleyDiffuse(albedoInput.rgb, roughness, ndv, ndl, vdh);
     float3 specularFactor = 0;

+ 5 - 4
bin/CoreData/Shaders/HLSL/PBRLitSolid.hlsl

@@ -263,12 +263,13 @@ void PS(
         #endif
 
         const float3 toCamera = normalize(cCameraPosPS - iWorldPos.xyz);
+        const float3 lightVec = normalize(lightDir);
 
         const float3 Hn = normalize(toCamera + lightDir);
-        const float vdh = max(M_EPSILON, dot(toCamera, Hn));
-        const float ndh = max(M_EPSILON, dot(normal, Hn));
-        const float ndl = max(M_EPSILON, dot(normal, lightDir));
-        const float ndv = max(M_EPSILON, dot(normal, toCamera));
+        const float vdh = clamp(abs(dot(toCamera, Hn)), M_EPSILON, 1.0);
+        const float ndh = clamp(abs(dot(normal, Hn)), M_EPSILON, 1.0);
+        const float ndl = clamp(abs(dot(normal, lightVec)), M_EPSILON, 1.0);
+        const float ndv = clamp(abs(dot(normal, toCamera)), M_EPSILON, 1.0);
 
         const float3 diffuseFactor = BurleyDiffuse(diffColor.rgb, roughness, ndv, ndl, vdh);
         float3 specularFactor = 0;