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