瀏覽代碼

Merge pull request #7857 from Popov72/fix-pbr-bug

PBR: Fix bugs when specific combinations of parameters are used
David Catuhe 5 年之前
父節點
當前提交
9dc41ad1f5
共有 2 個文件被更改,包括 11 次插入10 次删除
  1. 1 0
      dist/preview release/what's new.md
  2. 10 10
      src/Shaders/pbr.fragment.fx

+ 1 - 0
dist/preview release/what's new.md

@@ -84,5 +84,6 @@
 - Fixed delay calculation in Animatable.goToFrame when speedRatio != 1 ([Reimund Järnfors](https://github.com/reimund)
 - Fix bug in PBR when translucency is enabled and an irradiance texture is provided ([Popov72](https://github.com/Popov72)
 - Fix bug in PBR with translucency when irradiance texture is 2D ([Popov72](https://github.com/Popov72)
+- Fix bug in PBR when specific combinations of parameters are used ([Popov72](https://github.com/Popov72)
 
 ## Breaking changes

+ 10 - 10
src/Shaders/pbr.fragment.fx

@@ -170,6 +170,7 @@ void main(void) {
     // _____________________________ Reflectivity Info _______________________________
     float microSurface = vReflectivityColor.a;
     vec3 surfaceReflectivityColor = vReflectivityColor.rgb;
+    vec3 baseColor = surfaceAlbedo;
 
     #ifdef METALLICWORKFLOW
         vec2 metallicRoughness = surfaceReflectivityColor.rg;
@@ -208,8 +209,6 @@ void main(void) {
         microSurface = 1.0 - metallicRoughness.g;
 
         // Diffuse is used as the base of the reflectivity.
-        vec3 baseColor = surfaceAlbedo;
-
         #ifdef REFLECTANCE
             // *** NOT USED ANYMORE ***
             // Following Frostbite Remapping,
@@ -516,9 +515,10 @@ void main(void) {
                 environmentIrradiance = computeEnvironmentIrradiance(irradianceVector);
             #endif
         #elif defined(USEIRRADIANCEMAP)
-            environmentIrradiance = sampleReflection(irradianceSampler, reflectionCoords).rgb;
+            vec4 environmentIrradiance4 = sampleReflection(irradianceSampler, reflectionCoords);
+            environmentIrradiance = environmentIrradiance4.rgb;
             #ifdef RGBDREFLECTION
-                environmentIrradiance.rgb = fromRGBD(environmentIrradiance);
+                environmentIrradiance.rgb = fromRGBD(environmentIrradiance4);
             #endif
 
             #ifdef GAMMAREFLECTION
@@ -740,7 +740,7 @@ void main(void) {
             #if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
                 float clearCoatReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, clearCoatAlphaG, clearCoatNdotVUnclamped);
             #elif defined(LINEARSPECULARREFLECTION)
-                float sheenReflectionLOD = getLinearLodFromRoughness(vReflectionMicrosurfaceInfos.x, clearCoatRoughness);
+                float clearCoatReflectionLOD = getLinearLodFromRoughness(vReflectionMicrosurfaceInfos.x, clearCoatRoughness);
             #else
                 float clearCoatReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, clearCoatAlphaG);
             #endif
@@ -1048,7 +1048,7 @@ void main(void) {
         #endif
 
         #if defined(USESPHERICALFROMREFLECTIONMAP)
-            vec3 refractionIrradiance = computeEnvironmentIrradiance(-irradianceVector);
+            vec4 refractionIrradiance = vec4(computeEnvironmentIrradiance(-irradianceVector), 0.0);
         #elif defined(USEIRRADIANCEMAP)
             #ifdef REFLECTIONMAP_3D
                 vec3 irradianceCoords = irradianceVector;
@@ -1060,7 +1060,7 @@ void main(void) {
                 irradianceCoords.y = 1.0 - irradianceCoords.y;
             #endif
 
-            vec3 refractionIrradiance = sampleReflection(irradianceSampler, -irradianceCoords).rgb;
+            vec4 refractionIrradiance = sampleReflection(irradianceSampler, -irradianceCoords);
             #ifdef RGBDREFLECTION
                 refractionIrradiance.rgb = fromRGBD(refractionIrradiance);
             #endif
@@ -1069,10 +1069,10 @@ void main(void) {
                 refractionIrradiance.rgb = toLinearSpace(refractionIrradiance.rgb);
             #endif
         #else
-            vec3 refractionIrradiance = vec3(0.);
+            vec4 refractionIrradiance = vec4(0.);
         #endif
 
-        refractionIrradiance *= transmittance;
+        refractionIrradiance.rgb *= transmittance;
     #endif
 
     // ______________________________________________________________________________
@@ -1092,7 +1092,7 @@ void main(void) {
     #ifdef REFLECTION
         vec3 finalIrradiance = environmentIrradiance;
         #if defined(SS_TRANSLUCENCY)
-            finalIrradiance += refractionIrradiance;
+            finalIrradiance += refractionIrradiance.rgb;
         #endif
         finalIrradiance *= surfaceAlbedo.rgb;
     #endif