From d0073d0927f458c7084644510181301e8f9e4b5c Mon Sep 17 00:00:00 2001 From: Alexander Gauggel <agauggel@uni-koblenz.de> Date: Wed, 18 Aug 2021 12:25:59 +0200 Subject: [PATCH] [#106] Add options for object rotation to stress test motion blur under complex movement --- .../resources/shaders/mesh.frag | 6 +++--- .../resources/shaders/mesh.vert | 9 +++++---- projects/indirect_dispatch/src/App.cpp | 16 ++++++++++++---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/projects/indirect_dispatch/resources/shaders/mesh.frag b/projects/indirect_dispatch/resources/shaders/mesh.frag index 7da116a5..7e57746e 100644 --- a/projects/indirect_dispatch/resources/shaders/mesh.frag +++ b/projects/indirect_dispatch/resources/shaders/mesh.frag @@ -2,13 +2,13 @@ #extension GL_ARB_separate_shader_objects : enable layout(location = 0) in vec3 passNormal; -layout(location = 1) in vec3 passPos; +layout(location = 1) in vec3 passPosObject; layout(location = 0) out vec3 outColor; void main() { - vec3 albedo = vec3(sin(passPos.y * 100) * 0.5 + 0.5); + vec3 albedo = vec3(sin(passPosObject.y * 100) * 0.5 + 0.5); vec3 N = normalize(passNormal); float light = max(N.y * 0.5 + 0.5, 0); - outColor = light * albedo; + outColor = light * albedo; } \ No newline at end of file diff --git a/projects/indirect_dispatch/resources/shaders/mesh.vert b/projects/indirect_dispatch/resources/shaders/mesh.vert index 769867e3..175d88c8 100644 --- a/projects/indirect_dispatch/resources/shaders/mesh.vert +++ b/projects/indirect_dispatch/resources/shaders/mesh.vert @@ -5,14 +5,15 @@ layout(location = 0) in vec3 inPosition; layout(location = 1) in vec3 inNormal; layout(location = 0) out vec3 passNormal; -layout(location = 1) out vec3 passPos; +layout(location = 1) out vec3 passPosObject; layout( push_constant ) uniform constants{ mat4 mvp; + mat4 model; }; void main() { - gl_Position = mvp * vec4(inPosition, 1.0); - passNormal = inNormal; - passPos = inPosition; + gl_Position = mvp * vec4(inPosition, 1.0); + passNormal = (model * vec4(inNormal, 0)).xyz; + passPosObject = inPosition; } \ No newline at end of file diff --git a/projects/indirect_dispatch/src/App.cpp b/projects/indirect_dispatch/src/App.cpp index b27798b6..8fb9031b 100644 --- a/projects/indirect_dispatch/src/App.cpp +++ b/projects/indirect_dispatch/src/App.cpp @@ -92,8 +92,10 @@ void App::run() { eMotionVectorMode motionBlurMotionMode = eMotionVectorMode::MaxTileNeighbourhood; float objectVerticalSpeed = 5; - float objectAmplitude = 1; + float objectAmplitude = 0; float objectMeanHeight = 1; + float objectRotationSpeedX = 5; + float objectRotationSpeedY = 5; int cameraShutterSpeedInverse = 24; float motionVectorVisualisationRange = 0.008; @@ -116,7 +118,10 @@ void App::run() { sphere.meshResources = m_cubeMesh; sphere.modelMatrixUpdate = [&](float time, Object& obj) { const float currentHeight = objectMeanHeight + objectAmplitude * glm::sin(time * objectVerticalSpeed); - obj.modelMatrix = glm::translate(glm::mat4(1), glm::vec3(0, currentHeight, 0)); + const glm::mat4 translation = glm::translate(glm::mat4(1), glm::vec3(0, currentHeight, 0)); + const glm::mat4 rotationX = glm::rotate(glm::mat4(1), objectRotationSpeedX * time, glm::vec3(1, 0, 0)); + const glm::mat4 rotationY = glm::rotate(glm::mat4(1), objectRotationSpeedY * time, glm::vec3(0, 1, 0)); + obj.modelMatrix = translation * rotationX * rotationY; }; sceneObjects.push_back(sphere); @@ -203,9 +208,10 @@ void App::run() { m_renderTargets.colorBuffer, m_renderTargets.depthBuffer }; - vkcv::PushConstants meshPushConstants(sizeof(glm::mat4)); + vkcv::PushConstants meshPushConstants(2 * sizeof(glm::mat4)); for (const Object& obj : sceneObjects) { - meshPushConstants.appendDrawcall(obj.mvp); + glm::mat4 matrices[2] = { obj.mvp, obj.modelMatrix }; + meshPushConstants.appendDrawcall(matrices); } m_core.recordDrawcallsToCmdStream( @@ -322,6 +328,8 @@ void App::run() { ImGui::InputFloat("Object movement speed", &objectVerticalSpeed); ImGui::InputFloat("Object movement amplitude", &objectAmplitude); ImGui::InputFloat("Object mean height", &objectMeanHeight); + ImGui::InputFloat("Object rotation speed X", &objectRotationSpeedX); + ImGui::InputFloat("Object rotation speed Y", &objectRotationSpeedY); ImGui::End(); gui.endGUI(); -- GitLab