浏览代码

ESM for point light

David Catuhe 8 年之前
父节点
当前提交
3ad6edb33f

文件差异内容过多而无法显示
+ 595 - 609
dist/preview release/babylon.d.ts


文件差异内容过多而无法显示
+ 595 - 609
dist/preview release/babylon.module.d.ts


+ 4 - 4
materialsLibrary/src/gradient/babylon.gradientMaterial.ts

@@ -34,10 +34,10 @@ module BABYLON {
         public SHADOW2 = false;
         public SHADOW3 = false;
         public SHADOWS = false;
-        public SHADOWVSM0 = false;
-        public SHADOWVSM1 = false;
-        public SHADOWVSM2 = false;
-        public SHADOWVSM3 = false;
+        public SHADOWESM0 = false;
+        public SHADOWESM1 = false;
+        public SHADOWESM2 = false;
+        public SHADOWESM3 = false;
         public SHADOWPCF0 = false;
         public SHADOWPCF1 = false;
         public SHADOWPCF2 = false;

+ 4 - 4
materialsLibrary/src/lava/babylon.lavaMaterial.ts

@@ -32,10 +32,10 @@ module BABYLON {
         public SHADOW2 = false;
         public SHADOW3 = false;
         public SHADOWS = false;
-        public SHADOWVSM0 = false;
-        public SHADOWVSM1 = false;
-        public SHADOWVSM2 = false;
-        public SHADOWVSM3 = false;
+        public SHADOWESM0 = false;
+        public SHADOWESM1 = false;
+        public SHADOWESM2 = false;
+        public SHADOWESM3 = false;
         public SHADOWPCF0 = false;
         public SHADOWPCF1 = false;
         public SHADOWPCF2 = false;

+ 4 - 4
materialsLibrary/src/normal/babylon.normalMaterial.ts

@@ -32,10 +32,10 @@ module BABYLON {
         public SHADOW2 = false;
         public SHADOW3 = false;
         public SHADOWS = false;
-        public SHADOWVSM0 = false;
-        public SHADOWVSM1 = false;
-        public SHADOWVSM2 = false;
-        public SHADOWVSM3 = false;
+        public SHADOWESM0 = false;
+        public SHADOWESM1 = false;
+        public SHADOWESM2 = false;
+        public SHADOWESM3 = false;
         public SHADOWPCF0 = false;
         public SHADOWPCF1 = false;
         public SHADOWPCF2 = false;

+ 6 - 2
src/Lights/Shadows/babylon.shadowGenerator.ts

@@ -130,8 +130,12 @@
         public get useBlurExponentialShadowMap(): boolean {
             return this.filter === ShadowGenerator.FILTER_BLUREXPONENTIALSHADOWMAP;
         }
-        public set useBlurExponentialShadowMap(value: boolean) {
-            this.filter = (value ? ShadowGenerator.FILTER_BLUREXPONENTIALSHADOWMAP : ShadowGenerator.FILTER_NONE);
+        public set useBlurExponentialShadowMap(value: boolean) {            
+            if (this._light.needCube() && value) {
+                this.useExponentialShadowMap = true; // Blurring the cubemap is going to be too expensive. Reverting to unblurred version
+            } else {
+                this.filter = (value ? ShadowGenerator.FILTER_BLUREXPONENTIALSHADOWMAP : ShadowGenerator.FILTER_NONE);
+            }
         }
 
         private _light: IShadowLight;

+ 0 - 6
src/Lights/babylon.directionalLight.ts

@@ -120,12 +120,6 @@ module BABYLON {
         /**
          * Boolean : true by default.  
          */
-        public supportsVSM(): boolean {
-            return true;
-        }
-        /**
-         * Boolean : true by default.  
-         */
         public needRefreshPerFrame(): boolean {
             return true;
         }

+ 0 - 1
src/Lights/babylon.light.ts

@@ -13,7 +13,6 @@
         customProjectionMatrixBuilder: (viewMatrix: Matrix, renderList: Array<AbstractMesh>, result: Matrix) => void;
         setShadowProjectionMatrix(matrix: Matrix, viewMatrix: Matrix, renderList: Array<AbstractMesh>): void;
 
-        supportsVSM(): boolean;
         needRefreshPerFrame(): boolean;
         needCube(): boolean;
 

+ 0 - 6
src/Lights/babylon.pointLight.ts

@@ -79,12 +79,6 @@
         /**
          * Boolean : returns false by default.  
          */
-        public supportsVSM(): boolean {
-            return false;
-        }
-        /**
-         * Boolean : returns false by default.  
-         */
         public needRefreshPerFrame(): boolean {
             return false;
         }

+ 0 - 6
src/Lights/babylon.spotLight.ts

@@ -69,12 +69,6 @@
             return false;
         }
         /**
-         * Boolean : true by default.  
-         */
-        public supportsVSM(): boolean {
-            return true;
-        }
-        /**
          * Boolean : false by default.  
          */
         public needRefreshPerFrame(): boolean {

+ 0 - 4
src/Materials/babylon.materialHelper.ts

@@ -183,10 +183,6 @@
                     fallbacks.addFallback(0, "SHADOWPCF" + lightIndex);
                 }
 
-                if (defines["SHADOWVSM" + lightIndex]) {
-                    fallbacks.addFallback(0, "SHADOWVSM" + lightIndex);
-                }
-
                 if (defines["SHADOWESM" + lightIndex]) {
                     fallbacks.addFallback(0, "SHADOWESM" + lightIndex);
                 }

+ 5 - 5
src/Shaders/ShadersInclude/lightFragment.fx

@@ -17,11 +17,12 @@
     #endif
 	#ifdef SHADOW{X}
 		#ifdef SHADOWESM{X}
-			shadow = computeShadowWithESM(vPositionFromLight{X}, shadowSampler{X}, shadowsInfo{X}.x);
-		#else	
-			#ifdef SHADOWVSM{X}
-				shadow = computeShadowWithVSM(vPositionFromLight{X}, shadowSampler{X}, shadowsInfo{X}.x);
+			#if defined(POINTLIGHT{X})
+				shadow = computeShadowWithESMCube(vLightData{X}.xyz, shadowSampler{X}, shadowsInfo{X}.x);
 			#else
+				shadow = computeShadowWithESM(vPositionFromLight{X}, shadowSampler{X}, shadowsInfo{X}.x);
+			#endif
+		#else	
 			#ifdef SHADOWPCF{X}
 				#if defined(POINTLIGHT{X})
 					shadow = computeShadowWithPCFCube(vLightData{X}.xyz, shadowSampler{X}, shadowsInfo{X}.y, shadowsInfo{X}.x);
@@ -36,7 +37,6 @@
 				#endif
 			#endif
 		#endif
-	#endif
 	#else
 		shadow = 1.;
 	#endif

+ 21 - 1
src/Shaders/ShadersInclude/shadowsFragmentFunctions.fx

@@ -68,6 +68,26 @@
 		return  min(1.0, visibility + darkness);
 	}
 
+	float computeShadowWithESMCube(vec3 lightPosition, samplerCube shadowSampler, float darkness)
+	{
+		vec3 directionToLight = vPositionW - lightPosition;
+		float depth = length(directionToLight);
+		depth = (depth - depthValues.x) / (depthValues.y - depthValues.x);
+		float shadowPixelDepth = clamp(depth, 0., 1.0);
+
+		directionToLight = normalize(directionToLight);
+		directionToLight.y = -directionToLight.y;
+		
+		#ifndef SHADOWFULLFLOAT
+			float shadowMapSample = unpack(textureCube(shadowSampler, directionToLight));
+		#else
+			float shadowMapSample = textureCube(shadowSampler, directionToLight).x;
+		#endif
+
+		const float shadowStrength = 30.;
+		return 1.0 - clamp(exp(-shadowStrength * shadowPixelDepth) * shadowMapSample - darkness, 0., 1.);
+	}
+
 	float computeShadow(vec4 vPositionFromLight, sampler2D shadowSampler, float darkness)
 	{
 		vec3 depth = vPositionFromLight.xyz / vPositionFromLight.w;
@@ -155,7 +175,7 @@
 		#endif
 
 		const float shadowStrength = 5.;
-		float esm = 1.0 - clamp(exp(-shadowStrength * shadowPixelDepth) * shadowMapSample, 0., 1.);
+		float esm = 1.0 - clamp(exp(-shadowStrength * shadowPixelDepth) * shadowMapSample - darkness, 0., 1.);
 
 		// Apply fade out at frustum edge
 		const float fadeDistance = 0.07;