Przeglądaj źródła

Update TAA
Add TAA support fro genfog

ShiroSmith 4 lat temu
rodzic
commit
1b1e3f0a0e

+ 10 - 0
hrt/prefab/rfx/GenFog.hx

@@ -153,6 +153,16 @@ class GenFog extends RendererFX {
 				fogPass.shader.noiseAmount.set(p.noise.amount * p.noise.distAmount, p.noise.amount * p.noise.distAmount, p.noise.amount);
 			}
 
+			// TAA Support
+			for( e in r.effects ) {
+				var taa = Std.downcast(e, hrt.prefab.rfx.TemporalFiltering);
+				if( taa != null ) {
+					fogPass.shader.TAA_UNJITTER = true;
+					fogPass.shader.uvJitter.load(taa.pass.shader.jitterUV);
+					fogPass.shader.inverseViewProjNoJitter.initInverse(taa.curMatJitter);
+					break;
+				}
+			}
 
 			fogPass.setGlobals(ctx);
 			fogPass.render();

+ 7 - 2
hrt/prefab/rfx/PbrShader.hx

@@ -23,16 +23,21 @@ class PbrShader extends h3d.shader.ScreenShader {
 			var time : Float;
 		};
 
+		// TAA Support
+		@const var TAA_UNJITTER = false;
+		@param var uvJitter : Vec2;
+		@param var inverseViewProjNoJitter : Mat4;
+
 		function getPositionAt( uv: Vec2 ) : Vec3 {
 			var depth = depthMap.get(uv);
 			var uv2 = uvToScreen(uv);
-			var temp = vec4(uv2, depth, 1) * camera.inverseViewProj;
+			var temp = vec4(uv2, depth, 1) * (TAA_UNJITTER ? inverseViewProjNoJitter : camera.inverseViewProj);
 			var originWS = temp.xyz / temp.w;
 			return originWS;
 		}
 
 		function getPosition() : Vec3 {
-			return getPositionAt(calculatedUV);
+			return getPositionAt(TAA_UNJITTER ? calculatedUV - uvJitter : calculatedUV);
 		}
 
 	};

+ 8 - 5
hrt/prefab/rfx/TemporalFiltering.hx

@@ -88,7 +88,7 @@ class TemporalFilteringShader extends h3d.shader.ScreenShader {
 		function fragment() {
 			var unJitteredUV = calculatedUV;
 			if( UNJITTER )
-				unJitteredUV -= jitterUV * 0.5;
+				unJitteredUV -= jitterUV;
 
 			var curPos = getPixelPosition(calculatedUV);
 			var prevPos = vec4(curPos, 1.0) * prevCamMat;
@@ -123,7 +123,9 @@ class TemporalFiltering extends hrt.prefab.rfx.RendererFX {
 	public var frustumJitter = new FrustumJitter();
 	public var pass = new h3d.pass.ScreenFx(new TemporalFilteringShader());
 	public var jitterMat = new h3d.Matrix();
-	var curMatNoJitter = new h3d.Matrix();
+
+	public var curMatNoJitter = new h3d.Matrix();
+	public var curMatJitter = new h3d.Matrix();
 
 	public function new(?parent) {
 		super(parent);
@@ -160,11 +162,12 @@ class TemporalFiltering extends hrt.prefab.rfx.RendererFX {
 			jitterMat.identity();
 			jitterMat.translate(frustumJitter.curSample.x / ctx.engine.width, frustumJitter.curSample.y / ctx.engine.height);
 
-			s.prevJitterUV.set(-frustumJitter.prevSample.x / ctx.engine.width, frustumJitter.prevSample.y / ctx.engine.height);
-			s.jitterUV.set(-frustumJitter.curSample.x / ctx.engine.width, frustumJitter.curSample.y / ctx.engine.height);
+			s.prevJitterUV.set(s.jitterUV.x, s.jitterUV.y);
+			s.jitterUV.set(-frustumJitter.curSample.x / ctx.engine.width * 0.5, frustumJitter.curSample.y / ctx.engine.height * 0.5);
 
 			curMatNoJitter.load(ctx.camera.m);
-			ctx.camera.m.load(getMatrixJittered(ctx.camera));
+			curMatJitter.multiply(curMatNoJitter, jitterMat);
+			ctx.camera.m.load(curMatJitter);
 			@:privateAccess ctx.camera.needInv = true;
 			s.cameraInverseViewProj.initInverse(curMatNoJitter);
 		}