Browse Source

Fix handling of mesh visibility

Gary Hsu 6 years ago
parent
commit
3f3c528cf4

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

@@ -203,8 +203,8 @@
 - Tools.CreateScreenshot stopped working ([TrevorDev](https://github.com/TrevorDev))
 - Inspector showing duplicate nodes when attached to gizmo ([TrevorDev](https://github.com/TrevorDev))
 - Add missing dependencies for files to support including them from a direct path (eg. import "@babylonjs/core/Helpers/sceneHelpers";) ([TrevorDev](https://github.com/TrevorDev))
-- Fix a bug with mesh visibility in PBR materials ([bghgary](https://github.com/bghgary))
 - AssetContainer should not dispose objects it doesn't contain, Support for environmentTexture ([TrevorDev](https://github.com/TrevorDev))
+- Fix `mesh.visibility` not working properly when certain material properties are set that changes the interpretation of alpha (e.g. refraction, specular over alpha, etc.) ([bghgary](https://github.com/bghgary))
 
 ### Core Engine
 - Fixed a bug with `mesh.alwaysSelectAsActiveMesh` preventing layerMask to be taken in account ([Deltakosh](https://github.com/deltakosh))

+ 6 - 5
src/Materials/PBR/pbrBaseMaterial.ts

@@ -1182,7 +1182,7 @@ export abstract class PBRBaseMaterial extends PushMaterial {
         MaterialHelper.PrepareAttributesForInstances(attribs, defines);
         MaterialHelper.PrepareAttributesForMorphTargets(attribs, mesh, defines);
 
-        var uniforms = ["world", "view", "viewProjection", "vEyePosition", "vLightsType", "vAmbientColor", "vAlbedoColor", "vReflectivityColor", "vEmissiveColor", "vReflectionColor",
+        var uniforms = ["world", "view", "viewProjection", "vEyePosition", "vLightsType", "vAmbientColor", "vAlbedoColor", "vReflectivityColor", "vEmissiveColor", "visibility", "vReflectionColor",
             "vFogInfos", "vFogColor", "pointSize",
             "vAlbedoInfos", "vAmbientInfos", "vOpacityInfos", "vReflectionInfos", "vReflectionPosition", "vReflectionSize", "vEmissiveInfos", "vReflectivityInfos",
             "vMicroSurfaceSamplerInfos", "vBumpInfos", "vLightmapInfos", "vRefractionInfos",
@@ -1593,10 +1593,10 @@ export abstract class PBRBaseMaterial extends PushMaterial {
 
         this._uniformBuffer.addUniform("vRefractionMicrosurfaceInfos", 3);
         this._uniformBuffer.addUniform("vReflectionMicrosurfaceInfos", 3);
+        this._uniformBuffer.addUniform("pointSize", 1);
         this._uniformBuffer.addUniform("vReflectivityColor", 4);
         this._uniformBuffer.addUniform("vEmissiveColor", 3);
-
-        this._uniformBuffer.addUniform("pointSize", 1);
+        this._uniformBuffer.addUniform("visibility", 1);
 
         PBRClearCoatConfiguration.PrepareUniformBuffer(this._uniformBuffer);
         PBRAnisotropicConfiguration.PrepareUniformBuffer(this._uniformBuffer);
@@ -1789,9 +1789,10 @@ export abstract class PBRBaseMaterial extends PushMaterial {
 
                 this._uniformBuffer.updateColor3("vEmissiveColor", MaterialFlags.EmissiveTextureEnabled ? this._emissiveColor : Color3.BlackReadOnly);
                 this._uniformBuffer.updateColor3("vReflectionColor", this._reflectionColor);
+                this._uniformBuffer.updateColor4("vAlbedoColor", this._albedoColor, this.alpha);
 
-                const alpha = (this._transparencyMode === PBRBaseMaterial.PBRMATERIAL_OPAQUE) ? mesh.visibility : this.alpha * mesh.visibility;
-                this._uniformBuffer.updateColor4("vAlbedoColor", this._albedoColor, alpha);
+                // Visibility
+                this._uniformBuffer.updateFloat("visibility", mesh.visibility);
 
                 // Misc
                 this._lightingInfos.x = this._directIntensity;

+ 7 - 3
src/Materials/standardMaterial.ts

@@ -1117,7 +1117,7 @@ export class StandardMaterial extends PushMaterial {
 
             var shaderName = "default";
 
-            var uniforms = ["world", "view", "viewProjection", "vEyePosition", "vLightsType", "vAmbientColor", "vDiffuseColor", "vSpecularColor", "vEmissiveColor",
+            var uniforms = ["world", "view", "viewProjection", "vEyePosition", "vLightsType", "vAmbientColor", "vDiffuseColor", "vSpecularColor", "vEmissiveColor", "visiblity",
                 "vFogInfos", "vFogColor", "pointSize",
                 "vDiffuseInfos", "vAmbientInfos", "vOpacityInfos", "vReflectionInfos", "vEmissiveInfos", "vSpecularInfos", "vBumpInfos", "vLightmapInfos", "vRefractionInfos",
                 "mBones",
@@ -1224,12 +1224,13 @@ export class StandardMaterial extends PushMaterial {
         this._uniformBuffer.addUniform("specularMatrix", 16);
         this._uniformBuffer.addUniform("bumpMatrix", 16);
         this._uniformBuffer.addUniform("vTangentSpaceParams", 2);
+        this._uniformBuffer.addUniform("pointSize", 1);
         this._uniformBuffer.addUniform("refractionMatrix", 16);
         this._uniformBuffer.addUniform("vRefractionInfos", 4);
         this._uniformBuffer.addUniform("vSpecularColor", 4);
         this._uniformBuffer.addUniform("vEmissiveColor", 3);
+        this._uniformBuffer.addUniform("visibility", 1);
         this._uniformBuffer.addUniform("vDiffuseColor", 4);
-        this._uniformBuffer.addUniform("pointSize", 1);
 
         this._uniformBuffer.create();
     }
@@ -1407,8 +1408,11 @@ export class StandardMaterial extends PushMaterial {
                 }
                 this._uniformBuffer.updateColor3("vEmissiveColor", StandardMaterial.EmissiveTextureEnabled ? this.emissiveColor : Color3.BlackReadOnly);
 
+                // Visibility
+                this._uniformBuffer.updateFloat("visibility", mesh.visibility);
+
                 // Diffuse
-                this._uniformBuffer.updateColor4("vDiffuseColor", this.diffuseColor, this.alpha * mesh.visibility);
+                this._uniformBuffer.updateColor4("vDiffuseColor", this.diffuseColor, this.alpha);
             }
 
             // Textures

+ 2 - 0
src/Shaders/ShadersInclude/defaultFragmentDeclaration.fx

@@ -4,6 +4,8 @@ uniform vec4 vSpecularColor;
 #endif
 uniform vec3 vEmissiveColor;
 
+uniform float visibility;
+
 // Samplers
 #ifdef DIFFUSE
 uniform vec2 vDiffuseInfos;

+ 2 - 1
src/Shaders/ShadersInclude/defaultUboDeclaration.fx

@@ -30,12 +30,13 @@ uniform Material
 	mat4 specularMatrix;
 	mat4 bumpMatrix; 
 	vec2 vTangentSpaceParams;
+	float pointSize;
 	mat4 refractionMatrix;
 	vec4 vRefractionInfos;
 	vec4 vSpecularColor;
 	vec3 vEmissiveColor;
+	float visibility;
 	vec4 vDiffuseColor;
-	float pointSize; 
 };
 
 uniform Scene {

+ 3 - 1
src/Shaders/ShadersInclude/pbrFragmentDeclaration.fx

@@ -7,6 +7,8 @@ uniform vec4 vLightingIntensity;
 uniform vec4 vReflectivityColor;
 uniform vec3 vEmissiveColor;
 
+uniform float visibility;
+
 // Samplers
 #ifdef ALBEDO
 uniform vec2 vAlbedoInfos;
@@ -21,7 +23,7 @@ uniform vec3 vBumpInfos;
 uniform vec2 vTangentSpaceParams;
 #endif
 
-#ifdef OPACITY	
+#ifdef OPACITY
 uniform vec2 vOpacityInfos;
 #endif
 

+ 4 - 2
src/Shaders/ShadersInclude/pbrUboDeclaration.fx

@@ -12,7 +12,7 @@ uniform Material
     uniform vec4 vRefractionInfos;
     uniform vec2 vReflectionInfos;
     uniform vec3 vReflectionPosition;
-    uniform vec3 vReflectionSize;	
+    uniform vec3 vReflectionSize;
     uniform vec3 vBumpInfos;
     uniform mat4 albedoMatrix;
     uniform mat4 ambientMatrix;
@@ -33,10 +33,12 @@ uniform Material
     uniform vec3 vRefractionMicrosurfaceInfos;
     uniform vec3 vReflectionMicrosurfaceInfos;
 
+    uniform float pointSize;
+
     uniform vec4 vReflectivityColor;
     uniform vec3 vEmissiveColor;
 
-    uniform float pointSize;
+    uniform float visibility;
 
     uniform vec2 vClearCoatParams;
     uniform vec4 vClearCoatRefractionParams;

+ 2 - 0
src/Shaders/default.fragment.fx

@@ -440,6 +440,8 @@ color.rgb = max(color.rgb, 0.);
 	#endif
 #endif
 
+	color.a *= visibility;
+
 #ifdef PREMULTIPLYALPHA
 	// Convert to associative (premultiplied) format if needed.
 	color.rgb *= color.a;

+ 2 - 0
src/Shaders/pbr.fragment.fx

@@ -1121,6 +1121,8 @@ void main(void) {
     finalColor = applyImageProcessing(finalColor);
 #endif
 
+    finalColor.a *= visibility;
+
 #ifdef PREMULTIPLYALPHA
     // Convert to associative (premultiplied) format if needed.
     finalColor.rgb *= finalColor.a;