diff --git a/projects/indirect_dispatch/resources/shaders/motionBlurDummy.comp b/projects/indirect_dispatch/resources/shaders/motionBlurDummy.comp
index 8801203bd595983ba86b91dfc5e32ca6af8b5a90..55ea9e0c6fb1cca708e0c5ff86b441b900788809 100644
--- a/projects/indirect_dispatch/resources/shaders/motionBlurDummy.comp
+++ b/projects/indirect_dispatch/resources/shaders/motionBlurDummy.comp
@@ -8,6 +8,12 @@ layout(set=0, binding=3, r11f_g11f_b10f)    uniform image2D     outImage;
 
 layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
 
+layout( push_constant ) uniform constants{
+    // computed from delta time and shutter speed
+    float motionFactor;
+};
+
+
 void main(){
 
     if(any(greaterThanEqual(gl_GlobalInvocationID.xy, imageSize(outImage))))
@@ -18,6 +24,7 @@ void main(){
     vec2    uv          = vec2(coord) / textureRes;
 
     vec2    motion      = texture(sampler2D(inMotion, textureSampler), uv).rg;
+    motion              *= motionFactor;
 
     vec3        color       = vec3(0);
     const int   sampleCount = 16;
diff --git a/projects/indirect_dispatch/src/App.cpp b/projects/indirect_dispatch/src/App.cpp
index fa8f260a042e86f1f62774834dd6d277183cdaf5..9bcf3a572b2e9d5f53cc6f3b53933044f502e03a 100644
--- a/projects/indirect_dispatch/src/App.cpp
+++ b/projects/indirect_dispatch/src/App.cpp
@@ -101,7 +101,8 @@ void App::run() {
 	eDebugView          debugView       = eDebugView::None;
 	eMotionBlurInput    motionBlurInput = eMotionBlurInput::MotionVectorMaxTileNeighbourhood;
 
-	float objectVerticalSpeed = 0.005;
+	float   objectVerticalSpeed       = 0.005;
+	int     cameraShutterSpeedInverse = 48;
 
 	glm::mat4 mvpPrevious               = glm::mat4(1.f);
 	glm::mat4 viewProjectionPrevious    = m_cameraManager.getActiveCamera().getMVP();
@@ -126,7 +127,6 @@ void App::run() {
 
 		auto frameEndTime   = std::chrono::system_clock::now();
 		auto deltatime      = std::chrono::duration_cast<std::chrono::microseconds>(frameEndTime - frameStartTime);
-		frameStartTime      = frameEndTime;
 
 		m_cameraManager.update(0.000001 * static_cast<double>(deltatime.count()));
 		const glm::mat4 viewProjection = m_cameraManager.getActiveCamera().getMVP();
@@ -281,12 +281,19 @@ void App::run() {
 		m_core.prepareImageForSampling(cmdStream, m_renderTargets.colorBuffer);
 		m_core.prepareImageForSampling(cmdStream, motionBuffer);
 
+		const float microsecondToSecond     = 0.000001;
+		const float fDeltatimeSeconds       = microsecondToSecond * std::chrono::duration_cast<std::chrono::microseconds>(frameEndTime - frameStartTime).count();
+		const float motionBlurMotionFactor  = 1 / (fDeltatimeSeconds * cameraShutterSpeedInverse);
+
+		vkcv::PushConstants motionBlurPushConstants(sizeof(float));
+		motionBlurPushConstants.appendDrawcall(motionBlurMotionFactor);
+
 		m_core.recordComputeDispatchToCmdStream(
 			cmdStream,
 			m_motionBlurDummyPass.pipeline,
 			fullScreenImageDispatch,
 			{ vkcv::DescriptorSetUsage(0, m_core.getDescriptorSet(m_motionBlurDummyPass.descriptorSet).vulkanHandle) },
-			vkcv::PushConstants(0));
+			motionBlurPushConstants);
 
 		// gamma correction
 		vkcv::ImageHandle gammaCorrectionInput;
@@ -342,6 +349,7 @@ void App::run() {
 			static_cast<int>(eMotionBlurInput::OptionCount));
 
 		ImGui::InputFloat("Object movement speed", &objectVerticalSpeed);
+		ImGui::InputInt("Camera shutter speed inverse", &cameraShutterSpeedInverse);
 
 		ImGui::End();
 		gui.endGUI();
@@ -350,5 +358,6 @@ void App::run() {
 
 		viewProjectionPrevious  = viewProjection;
 		mvpPrevious             = mvp;
+		frameStartTime          = frameEndTime;
 	}
 }
\ No newline at end of file