Browse Source

Renderer: Optimize temporal AA

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
28d958cfcb
3 changed files with 8 additions and 23 deletions
  1. 5 12
      shaders/Taa.frag.glsl
  2. 1 1
      src/anki/renderer/Renderer.cpp
  3. 2 10
      src/anki/renderer/Taa.cpp

+ 5 - 12
shaders/Taa.frag.glsl

@@ -8,7 +8,7 @@
 #include "shaders/Tonemapping.glsl"
 
 #define YCBCR 1
-const float BLEND_FACTOR = 1.0 / 16.0;
+const float BLEND_FACTOR = 1.0 / 8.0;
 
 layout(location = 0) in vec2 in_uv;
 
@@ -20,8 +20,7 @@ layout(ANKI_TEX_BINDING(0, 2)) uniform sampler2D u_historyRt;
 
 layout(ANKI_UBO_BINDING(0, 0), std140, row_major) uniform u0_
 {
-	mat4 u_prevViewProjMat;
-	mat4 u_invViewProjMat;
+	mat4 u_prevViewProjMatMulInvViewProjMat;
 };
 
 #if YCBCR
@@ -36,15 +35,9 @@ void main()
 {
 	float depth = textureLod(u_depthRt, in_uv, 0.0).r;
 
-	// Get world position
-	vec4 worldPos4 = u_invViewProjMat * vec4(UV_TO_NDC(in_uv), UV_TO_NDC(depth), 1.0);
-	worldPos4 = worldPos4 / worldPos4.w;
-	vec3 worldPos = worldPos4.xyz;
-
-	// Project pos to get old ndc
-	vec4 oldNdc4 = u_prevViewProjMat * vec4(worldPos, 1.0);
-	vec2 oldNdc = oldNdc4.xy / oldNdc4.w;
-	vec2 oldUv = NDC_TO_UV(oldNdc);
+	// Get prev uv coords
+	vec4 v4 = u_prevViewProjMatMulInvViewProjMat * UV_TO_NDC(vec4(in_uv, depth, 1.0));
+	vec2 oldUv = NDC_TO_UV(v4.xy / v4.w);
 
 	// Read textures
 	vec3 historyCol = sample(u_historyRt, oldUv);

+ 1 - 1
src/anki/renderer/Renderer.cpp

@@ -236,7 +236,7 @@ Error Renderer::render(RenderingContext& ctx)
 {
 	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
 
-	ctx.m_jitterMat = m_jitteredMats16x[m_frameCount & (16 - 1)];
+	ctx.m_jitterMat = m_jitteredMats8x[m_frameCount & (8 - 1)];
 	ctx.m_projMatJitter = ctx.m_jitterMat * ctx.m_projMat;
 	ctx.m_viewProjMatJitter = ctx.m_projMatJitter * ctx.m_viewMat;
 

+ 2 - 10
src/anki/renderer/Taa.cpp

@@ -11,13 +11,6 @@
 namespace anki
 {
 
-class TaaUniforms
-{
-public:
-	Mat4 m_prevViewProjMat;
-	Mat4 m_invViewProjMat;
-};
-
 Taa::~Taa()
 {
 }
@@ -78,9 +71,8 @@ void Taa::run(RenderingContext& ctx)
 	cmdb->bindTextureAndSampler(0, 1, m_r->getIs().getRt(), m_r->getNearestSampler());
 	cmdb->bindTextureAndSampler(0, 2, m_rts[(m_r->getFrameCount() + 1) & 1], m_r->getLinearSampler());
 
-	TaaUniforms* unis = allocateAndBindUniforms<TaaUniforms*>(sizeof(TaaUniforms), cmdb, 0, 0);
-	unis->m_prevViewProjMat = ctx.m_jitterMat * ctx.m_prevViewProjMat;
-	unis->m_invViewProjMat = ctx.m_viewProjMatJitter.getInverse();
+	Mat4* unis = allocateAndBindUniforms<Mat4*>(sizeof(Mat4), cmdb, 0, 0);
+	*unis = ctx.m_jitterMat * ctx.m_prevViewProjMat * ctx.m_viewProjMatJitter.getInverse();
 
 	m_r->drawQuad(cmdb);
 	cmdb->endRenderPass();