浏览代码

Fix binormal in cotangent_frame when using right handed system

Gary Hsu 8 年之前
父节点
当前提交
0756f5d23f
共有 2 个文件被更改,包括 10 次插入1 次删除
  1. 6 1
      src/Materials/babylon.pbrMaterial.ts
  2. 4 0
      src/Shaders/ShadersInclude/bumpFragmentFunctions.fx

+ 6 - 1
src/Materials/babylon.pbrMaterial.ts

@@ -66,6 +66,7 @@
         public INVERTNORMALMAPY = false;
         public TWOSIDEDLIGHTING = false;
         public SHADOWFULLFLOAT = false;
+        public USERIGHTHANDEDSYSTEM = false;
 
         public METALLICWORKFLOW = false;
         public METALLICMAP = false;
@@ -763,7 +764,11 @@
                     if (scene._mirroredCameraPosition) {
                         this._defines.INVERTNORMALMAPX = !this._defines.INVERTNORMALMAPX;
                         this._defines.INVERTNORMALMAPY = !this._defines.INVERTNORMALMAPY;
-                    }                        
+                    }
+
+                    if (scene.useRightHandedSystem) {
+                        this._defines.USERIGHTHANDEDSYSTEM = true;
+                    }
                 }
 
                 if (this.refractionTexture && StandardMaterial.RefractionTextureEnabled) {

+ 4 - 0
src/Shaders/ShadersInclude/bumpFragmentFunctions.fx

@@ -23,6 +23,10 @@
 		vec3 tangent = dp2perp * duv1.x + dp1perp * duv2.x;
 		vec3 binormal = dp2perp * duv1.y + dp1perp * duv2.y;
 
+	#ifdef USERIGHTHANDEDSYSTEM
+		binormal = -binormal;
+	#endif
+
 		// construct a scale-invariant frame 
 		float invmax = inversesqrt(max(dot(tangent, tangent), dot(binormal, binormal)));
 		return mat3(tangent * invmax, binormal * invmax, normal);