Jelajahi Sumber

Shadow add Poisson Sampling

Clément Levasseur 11 tahun lalu
induk
melakukan
b248cefa35

+ 1 - 1
Babylon/Culling/babylon.boundingBox.js

@@ -156,4 +156,4 @@
     })();
     BABYLON.BoundingBox = BoundingBox;
 })(BABYLON || (BABYLON = {}));
-//# sourceMappingURL=babylon.boundingBox.js.map
+//# sourceMappingURL=babylon.BoundingBox.js.map

+ 1 - 0
Babylon/Lights/Shadows/babylon.shadowGenerator.js

@@ -5,6 +5,7 @@
             var _this = this;
             // Members
             this.useVarianceShadowMap = true;
+            this.usePoissonSampling = false;
             this._darkness = 0;
             this._transparencyShadow = false;
             this._viewMatrix = BABYLON.Matrix.Zero();

+ 1 - 0
Babylon/Lights/Shadows/babylon.shadowGenerator.ts

@@ -2,6 +2,7 @@
     export class ShadowGenerator {
         // Members
         public useVarianceShadowMap = true;
+        public usePoissonSampling = false;
 
         private _light: DirectionalLight;
         private _scene: Scene;

+ 7 - 0
Babylon/Materials/babylon.standardMaterial.js

@@ -223,6 +223,13 @@ var BABYLON;
                                 optionalDefines.push(defines[defines.length - 1]);
                             }
                         }
+
+                        if (shadowGenerator.usePoissonSampling) {
+                            defines.push("#define SHADOWPCF" + lightIndex);
+                            if (lightIndex > 0) {
+                                optionalDefines.push(defines[defines.length - 1]);
+                            }
+                        }
                     }
 
                     lightIndex++;

+ 7 - 0
Babylon/Materials/babylon.standardMaterial.ts

@@ -226,6 +226,13 @@
                                 optionalDefines.push(defines[defines.length - 1]);
                             }
                         }
+
+                        if (shadowGenerator.usePoissonSampling) {
+                            defines.push("#define SHADOWPCF" + lightIndex);
+                            if (lightIndex > 0) {
+                                optionalDefines.push(defines[defines.length - 1]);
+                            }
+                        }
                     }
 
                     lightIndex++;

+ 1 - 1
Babylon/Mesh/babylon.InstancedMesh.js

@@ -163,4 +163,4 @@ var BABYLON;
     })(BABYLON.AbstractMesh);
     BABYLON.InstancedMesh = InstancedMesh;
 })(BABYLON || (BABYLON = {}));
-//# sourceMappingURL=babylon.instancedMesh.js.map
+//# sourceMappingURL=babylon.InstancedMesh.js.map

+ 43 - 0
Babylon/Shaders/default.fragment.fx

@@ -201,6 +201,33 @@ float computeShadow(vec4 vPositionFromLight, sampler2D shadowSampler, float dark
 	return 1.;
 }
 
+float computeShadowWithPCF(vec4 vPositionFromLight, sampler2D shadowSampler)
+{
+	vec3 depth = vPositionFromLight.xyz / vPositionFromLight.w;
+	vec2 uv = 0.5 * depth.xy + vec2(0.5, 0.5);
+
+	if (uv.x < 0. || uv.x > 1.0 || uv.y < 0. || uv.y > 1.0)
+	{
+		return 1.0;
+	}
+
+	float visibility = 1.;
+
+    vec2 poissonDisk[4];
+	poissonDisk[0] = vec2( -0.94201624, -0.39906216 );
+	poissonDisk[1] = vec2( 0.94558609, -0.76890725 );
+	poissonDisk[2] = vec2( -0.094184101, -0.92938870 );
+	poissonDisk[3] = vec2( 0.34495938, 0.29387760 );
+
+	// Poisson Sampling
+	for (int i=0;i<4;i++){
+	   	if ( unpack(texture2D( shadowSampler, uv + poissonDisk[i]/1500.0 ))  <  depth.z ){
+	    	visibility -= 0.2;
+	  	}
+	}
+	return visibility;
+}
+
 // Thanks to http://devmaster.net/
 float ChebychevInequality(vec2 moments, float t)
 {
@@ -469,8 +496,12 @@ void main(void) {
 #ifdef SHADOWVSM0
 	shadow = computeShadowWithVSM(vPositionFromLight0, shadowSampler0);
 #else
+#ifdef SHADOWPCF0
+	shadow = computeShadowWithPCF(vPositionFromLight0, shadowSampler0);
+#else
 	shadow = computeShadow(vPositionFromLight0, shadowSampler0, darkness0);
 #endif
+#endif
 #else
 	shadow = 1.;
 #endif
@@ -492,8 +523,12 @@ void main(void) {
 #ifdef SHADOWVSM1
 	shadow = computeShadowWithVSM(vPositionFromLight1, shadowSampler1);
 #else
+#ifdef SHADOWPCF1
+	shadow = computeShadowWithPCF(vPositionFromLight1, shadowSampler1);
+#else
 	shadow = computeShadow(vPositionFromLight1, shadowSampler1, darkness1);
 #endif
+#endif
 #else
 	shadow = 1.;
 #endif
@@ -515,8 +550,12 @@ void main(void) {
 #ifdef SHADOWVSM2
 	shadow = computeShadowWithVSM(vPositionFromLight2, shadowSampler2);
 #else
+#ifdef SHADOWPCF2
+	shadow = computeShadowWithPCF(vPositionFromLight2, shadowSampler2);
+#else
 	shadow = computeShadow(vPositionFromLight2, shadowSampler2, darkness2);
 #endif	
+#endif	
 #else
 	shadow = 1.;
 #endif
@@ -538,8 +577,12 @@ void main(void) {
 #ifdef SHADOWVSM3
 	shadow = computeShadowWithVSM(vPositionFromLight3, shadowSampler3);
 #else
+#ifdef SHADOWPCF3
+	shadow = computeShadowWithPCF(vPositionFromLight3, shadowSampler3);
+#else
 	shadow = computeShadow(vPositionFromLight3, shadowSampler3, darkness3);
 #endif	
+#endif	
 #else
 	shadow = 1.;
 #endif