Przeglądaj źródła

Motion blur for static objects as well

Panagiotis Christopoulos Charitos 7 lat temu
rodzic
commit
eba0e919af

+ 1 - 0
samples/sponza/assets/Material__57_001-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/arch-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/bricks-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/ceiling-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/chain-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/column_a-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/column_b-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/column_c-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/details-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/fabric_a-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/fabric_c-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/fabric_d-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/fabric_e-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/fabric_f-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/flagpole-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/floor-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/leaf-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/lion-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/lion_stand-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/roof-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/vase-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/vase_hanging-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/vase_round_001-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 1 - 0
samples/sponza/assets/writings-material.ankimtl

@@ -14,6 +14,7 @@
 	
 	<inputs>
 		<input shaderInput="mvp" builtin="MODEL_VIEW_PROJECTION_MATRIX"/>
+		<input shaderInput="prevMvp" builtin="PREVIOUS_MODEL_VIEW_PROJECTION_MATRIX"/>
 		<input shaderInput="rotationMat" builtin="ROTATION_MATRIX"/>
 		
 	

+ 30 - 25
shaders/MotionBlur.glslp

@@ -14,9 +14,16 @@ layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_s
 
 layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_velocityRt;
 layout(ANKI_TEX_BINDING(0, 1)) uniform sampler2D u_toBlurRt;
+layout(ANKI_TEX_BINDING(0, 2)) uniform sampler2D u_depthRt;
 
 layout(ANKI_IMAGE_BINDING(0, 0)) writeonly uniform image2D out_img;
 
+struct PushConsts
+{
+	Mat4 m_prevViewProjMatMulInvViewProjMat;
+};
+ANKI_PUSH_CONSTANTS(PushConsts, u_regs);
+
 const Vec2 TEXEL_SIZE = 1.0 / Vec2(FB_SIZE);
 
 void main()
@@ -26,43 +33,41 @@ void main()
 	// Crnt UV
 	Vec2 nowUv = (Vec2(gl_GlobalInvocationID.xy) + 0.5) / Vec2(FB_SIZE);
 
-	// UV this frag had previously
+	// Compute previous UV
 	Vec2 pastUv = textureLod(u_velocityRt, nowUv, 0.0).rg;
 
-	// Do the work
-	Vec3 outColor;
-	ANKI_BRANCH if(pastUv.x >= 0.0)
+	ANKI_BRANCH if(pastUv.x < 0.0)
 	{
-		// Dynamic object
-
-		// March direction
-		Vec2 dir = pastUv - nowUv;
+		F32 depth = textureLod(u_depthRt, nowUv, 0.0).r;
 
-		Vec2 slopes = abs(dir);
+		Vec4 v4 = u_regs.m_prevViewProjMatMulInvViewProjMat * Vec4(UV_TO_NDC(nowUv), depth, 1.0);
+		pastUv = NDC_TO_UV(v4.xy / v4.w);
+	}
 
-		Vec2 sampleCount2D = slopes * Vec2(FB_SIZE);
-		F32 sampleCountf = max(sampleCount2D.x, sampleCount2D.y);
-		sampleCountf = clamp(sampleCountf, 1.0, F32(MAX_SAMPLES));
-		sampleCountf = round(sampleCountf);
+	// March direction
+	Vec2 dir = pastUv - nowUv;
 
-		outColor = Vec3(0.0);
-		ANKI_LOOP for(F32 s = 0.0; s < sampleCountf; s += 1.0)
-		{
-			F32 f = s / sampleCountf;
-			Vec2 sampleUv = nowUv + dir * f;
+	Vec2 slopes = abs(dir);
 
-			outColor += textureLod(u_toBlurRt, sampleUv, 0.0).rgb;
-		}
+	// Compute the sample count
+	Vec2 sampleCount2D = slopes * Vec2(FB_SIZE);
+	F32 sampleCountf = max(sampleCount2D.x, sampleCount2D.y);
+	sampleCountf = clamp(sampleCountf, 1.0, F32(MAX_SAMPLES));
+	sampleCountf = round(sampleCountf);
 
-		outColor /= sampleCountf;
-	}
-	else
+	// Loop
+	Vec3 outColor = Vec3(0.0);
+	ANKI_LOOP for(F32 s = 0.0; s < sampleCountf; s += 1.0)
 	{
-		// Static object, ATM camera motion blur is not supported
+		F32 f = s / sampleCountf;
+		Vec2 sampleUv = nowUv + dir * f;
 
-		outColor = textureLod(u_toBlurRt, nowUv, 0.0).rgb;
+		outColor += textureLod(u_toBlurRt, sampleUv, 0.0).rgb;
 	}
 
+	outColor /= sampleCountf;
+
+	// Write the result
 	imageStore(out_img, IVec2(gl_GlobalInvocationID.xy), Vec4(outColor, 0.0));
 }
 

+ 11 - 0
src/anki/renderer/MotionBlur.cpp

@@ -62,6 +62,7 @@ void MotionBlur::populateRenderGraph(RenderingContext& ctx)
 
 	pass.newConsumer({m_r->getTemporalAA().getRt(), TextureUsageBit::SAMPLED_COMPUTE});
 	pass.newConsumer({m_r->getGBuffer().getColorRt(3), TextureUsageBit::SAMPLED_COMPUTE});
+	pass.newConsumer({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
 	pass.newConsumerAndProducer({m_runCtx.m_rt, TextureUsageBit::IMAGE_COMPUTE_WRITE});
 
 	pass.setWork(runCallback, this, 0);
@@ -70,14 +71,24 @@ void MotionBlur::populateRenderGraph(RenderingContext& ctx)
 void MotionBlur::run(RenderPassWorkContext& rgraphCtx)
 {
 	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
+	const RenderingContext& ctx = *m_runCtx.m_ctx;
 
 	cmdb->bindShaderProgram(m_grProg);
 
 	rgraphCtx.bindColorTextureAndSampler(0, 0, m_r->getGBuffer().getColorRt(3), m_r->getNearestSampler());
 	rgraphCtx.bindColorTextureAndSampler(0, 1, m_r->getTemporalAA().getRt(), m_r->getNearestSampler());
+	rgraphCtx.bindTextureAndSampler(0,
+		2,
+		m_r->getGBuffer().getDepthRt(),
+		TextureSubresourceInfo(DepthStencilAspectBit::DEPTH),
+		m_r->getNearestSampler());
 
 	rgraphCtx.bindImage(0, 0, m_runCtx.m_rt, TextureSubresourceInfo());
 
+	Mat4 prevViewProjMatMulInvViewProjMat = ctx.m_matrices.m_jitter * ctx.m_prevMatrices.m_viewProjection
+											* ctx.m_matrices.m_viewProjectionJitter.getInverse();
+	cmdb->setPushConstants(&prevViewProjMatMulInvViewProjMat, sizeof(prevViewProjMatMulInvViewProjMat));
+
 	dispatchPPCompute(cmdb, m_workgroupSize[0], m_workgroupSize[1], m_r->getWidth(), m_r->getHeight());
 }
 

+ 1 - 1
thirdparty

@@ -1 +1 @@
-Subproject commit 9463ab160a76834c4ec4d70ef6949ba35ee06010
+Subproject commit d3db5c96229f84ef75ad4dd783aa684c714e75a2