소스 검색

Better VSM computation (ChebychevInequality)

David Catuhe 10 년 전
부모
커밋
8c04198b4b
5개의 변경된 파일23개의 추가작업 그리고 22개의 파일을 삭제
  1. 1 1
      Babylon/Audio/babylon.sound.js
  2. 1 1
      Babylon/Audio/babylon.sound.ts
  3. 16 15
      Babylon/Shaders/default.fragment.fx
  4. 2 2
      babylon.2.1-alpha.debug.js
  5. 3 3
      babylon.2.1-alpha.js

+ 1 - 1
Babylon/Audio/babylon.sound.js

@@ -326,7 +326,7 @@ var BABYLON;
             }
             }
         };
         };
         Sound.prototype.setVolume = function (newVolume, time) {
         Sound.prototype.setVolume = function (newVolume, time) {
-            if (BABYLON.Engine.audioEngine.canUseWebAudio) {
+            if (BABYLON.Engine.audioEngine.canUseWebAudio && !this.spatialSound) {
                 if (time) {
                 if (time) {
                     this._soundGain.gain.linearRampToValueAtTime(this._volume, BABYLON.Engine.audioEngine.audioContext.currentTime);
                     this._soundGain.gain.linearRampToValueAtTime(this._volume, BABYLON.Engine.audioEngine.audioContext.currentTime);
                     this._soundGain.gain.linearRampToValueAtTime(newVolume, time);
                     this._soundGain.gain.linearRampToValueAtTime(newVolume, time);

+ 1 - 1
Babylon/Audio/babylon.sound.ts

@@ -353,7 +353,7 @@
         }
         }
 
 
         public setVolume(newVolume: number, time?: number) {
         public setVolume(newVolume: number, time?: number) {
-            if (Engine.audioEngine.canUseWebAudio) {
+            if (Engine.audioEngine.canUseWebAudio && !this.spatialSound) {
                 if (time) {
                 if (time) {
                     this._soundGain.gain.linearRampToValueAtTime(this._volume, Engine.audioEngine.audioContext.currentTime);
                     this._soundGain.gain.linearRampToValueAtTime(this._volume, Engine.audioEngine.audioContext.currentTime);
                     this._soundGain.gain.linearRampToValueAtTime(newVolume, time);
                     this._soundGain.gain.linearRampToValueAtTime(newVolume, time);

+ 16 - 15
Babylon/Shaders/default.fragment.fx

@@ -253,28 +253,29 @@ float computeShadowWithPCF(vec4 vPositionFromLight, sampler2D shadowSampler, flo
 	poissonDisk[3] = vec2(0.34495938, 0.29387760);
 	poissonDisk[3] = vec2(0.34495938, 0.29387760);
 
 
 	// Poisson Sampling
 	// Poisson Sampling
-	if (unpack(texture2D(shadowSampler, uv + poissonDisk[0] / mapSize)) + bias  <  depth.z) visibility -= 0.25;
-	if (unpack(texture2D(shadowSampler, uv + poissonDisk[1] / mapSize)) + bias  <  depth.z) visibility -= 0.25;
-	if (unpack(texture2D(shadowSampler, uv + poissonDisk[2] / mapSize)) + bias  <  depth.z) visibility -= 0.25;
-	if (unpack(texture2D(shadowSampler, uv + poissonDisk[3] / mapSize)) + bias  <  depth.z) visibility -= 0.25;
+	float biasedDepth = depth.z - bias;
+
+	if (unpack(texture2D(shadowSampler, uv + poissonDisk[0] / mapSize)) < biasedDepth) visibility -= 0.25;
+	if (unpack(texture2D(shadowSampler, uv + poissonDisk[1] / mapSize)) < biasedDepth) visibility -= 0.25;
+	if (unpack(texture2D(shadowSampler, uv + poissonDisk[2] / mapSize)) < biasedDepth) visibility -= 0.25;
+	if (unpack(texture2D(shadowSampler, uv + poissonDisk[3] / mapSize)) < biasedDepth) visibility -= 0.25;
 
 
 	return visibility;
 	return visibility;
 }
 }
 
 
 // Thanks to http://devmaster.net/
 // Thanks to http://devmaster.net/
-float ChebychevInequality(vec2 moments, float t, float bias)
-{
-	if (t - bias <= moments.x)
-	{
-		return 0.0;
-	}
-
-	float variance = moments.y - (moments.x * moments.x);
-	variance = max(variance, 0.002);
+float linstep(float low, float high, float v) {
+	return clamp((v - low) / (high - low), 0.0, 1.0);
+}
 
 
-	float d = t - moments.x;
+float ChebychevInequality(vec2 moments, float compare, float bias)
+{
+	float p = smoothstep(compare - bias, compare, moments.x);
+	float variance = max(moments.y - moments.x * moments.x, 0.02);
+	float d = compare - moments.x;
+	float p_max = linstep(0.2, 1.0, variance / (variance + d * d));
 
 
-	return clamp(variance / (variance + d * d) - 0.05, 0.0, 1.0);
+	return clamp(max(p, p_max), 0.0, 1.0);
 }
 }
 
 
 float computeShadowWithVSM(vec4 vPositionFromLight, sampler2D shadowSampler, float bias)
 float computeShadowWithVSM(vec4 vPositionFromLight, sampler2D shadowSampler, float bias)

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2 - 2
babylon.2.1-alpha.debug.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 3
babylon.2.1-alpha.js