From fe9de4d93d643e4c307502dbb8e84f17701b56da Mon Sep 17 00:00:00 2001 From: Alexander Gauggel <agauggel@uni-koblenz.de> Date: Wed, 11 Aug 2021 15:44:42 +0200 Subject: [PATCH] [#106] Add shutter speed and make motion blur framerate independant --- .../resources/shaders/motionBlurDummy.comp | 7 +++++++ projects/indirect_dispatch/src/App.cpp | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/projects/indirect_dispatch/resources/shaders/motionBlurDummy.comp b/projects/indirect_dispatch/resources/shaders/motionBlurDummy.comp index 8801203b..55ea9e0c 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 fa8f260a..9bcf3a57 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 -- GitLab