From f1217cc20b9b8e406242d2a41ed52c60a300a6ef Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Fri, 17 Feb 2023 13:48:14 +0800 Subject: [PATCH] Trajectory Rendering WIP - Trajectory rendering system is all in place. Just requires testing through the component. - Component needs to be reflected in editor - Shaders for trajectory rendering is also in place --- Assets/Shaders/Trajectory_FS.shshaderb | Bin 0 -> 729 bytes Assets/Shaders/Trajectory_FS.shshaderb.shmeta | 3 + Assets/Shaders/Trajectory_VS.glsl | 4 +- Assets/Shaders/Trajectory_VS.shshaderb | Bin 0 -> 1973 bytes Assets/Shaders/Trajectory_VS.shshaderb.shmeta | 3 + .../MiddleEnd/Interface/SHGraphicsConstants.h | 12 ++++ .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 27 ++++++-- .../MiddleEnd/Interface/SHGraphicsSystem.h | 2 + .../SHTrajectoryRenderableComponent.cpp | 5 ++ .../SHTrajectoryRenderableComponent.h | 3 +- .../SHTrajectoryRenderingSubSystem.cpp | 58 +++++++++++------- .../SHTrajectoryRenderingSubSystem.h | 2 +- 12 files changed, 86 insertions(+), 33 deletions(-) create mode 100644 Assets/Shaders/Trajectory_FS.shshaderb create mode 100644 Assets/Shaders/Trajectory_FS.shshaderb.shmeta create mode 100644 Assets/Shaders/Trajectory_VS.shshaderb create mode 100644 Assets/Shaders/Trajectory_VS.shshaderb.shmeta diff --git a/Assets/Shaders/Trajectory_FS.shshaderb b/Assets/Shaders/Trajectory_FS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..9e6418664274937ed9d79371b46b6a1a16c80860 GIT binary patch literal 729 zcmY*W+e*Vg5FOj5)p~0!>RYM!D3l^9f+$pxAOtGvgKx{4ZtH4HVlD-L&oA(Ed=We+ zMyv~y**SCO?98O~QIXBvbbcUdO9hC?veXOjdbeIb&BpzM!vQI4QZ1O| ztV=^`@U$0gLnfABtFRV$#PI-bRj7)*qo@Xk>#5<*xk^o}6P+2AKI*YaRP^v<{4D*? zLCS_x73gr9>#0!(`-52f&(K+<&gK1`3ZpO&?IcQG)N8H-JFzA~zRA2h8oA!3^5a;g z*;`;#U_+zEHo;4FX82a2Q}S%+2l;rO;D9kdpCe8&<0R43iztW^%;jLdWq6)CqTl<> zB-wS80;?4mcb3ooINXUpr@_5lVT&&K++!EU!xPxu7cBj~^6!$IM>%e-jZSc8w z#_YX^?;#K-I3G0_voB(sh}YnIWxQ9$>xikz t`c|2v-Vxp)&i;7V$0ra6euyu*Z5Z{baSA5uHekfhP{IBgf1!h8*f&<_RKNfL literal 0 HcmV?d00001 diff --git a/Assets/Shaders/Trajectory_FS.shshaderb.shmeta b/Assets/Shaders/Trajectory_FS.shshaderb.shmeta new file mode 100644 index 00000000..296c38c9 --- /dev/null +++ b/Assets/Shaders/Trajectory_FS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: Trajectory_FS +ID: 45635685 +Type: 2 diff --git a/Assets/Shaders/Trajectory_VS.glsl b/Assets/Shaders/Trajectory_VS.glsl index 6d932734..86be6b7e 100644 --- a/Assets/Shaders/Trajectory_VS.glsl +++ b/Assets/Shaders/Trajectory_VS.glsl @@ -2,9 +2,9 @@ #extension GL_KHR_vulkan_glsl : enable // vertex inputs -layout(location = 0) in vec4 aPos; +layout(location = 0) in vec3 aPos; layout(location = 1) in vec2 aUV; -layout(location = 2) in vec2 aColor; +layout(location = 2) in vec4 aColor; layout(location = 3) in mat4 aTransform; // between shader stages diff --git a/Assets/Shaders/Trajectory_VS.shshaderb b/Assets/Shaders/Trajectory_VS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..6f509f5c39101e9c796f0e8d0de035a74a9217ec GIT binary patch literal 1973 zcmZ9L+iuf95Qd#LX-lCkrSt%l;SW&fA#Xg3urk@;Z2mgy)p&5=% zEbawq5Jy5M4WGRY9z^L;@J**ACyUXCVtZlG-4A-H7q$IijHwgrhv6_rugsWL(N~q; z^G^K4+xJp0>jjL}wT;MTHsB@6p!>#43m82N0{=6p<*|1+i9dm{&xZVVVIMH=*?X6G zQSU>XoX}6%+`Gr%wd(SjtL+z`+2Yd&zI`+FaG(mzmzBM;5e6R&ZF%H?(W}LNiyz7iLTieEvmy2Mg+mo~nux$6k^(A?-?*#b;l9W{5wP`*7FP zIsY3RaI`DVv^4dIJmM$4P%g5(k zfN`hyq&bVtzn{mzIR`%P20r`2-I6%Y_m{hR1N6ZeSk(9{gg501(T>)(~lnSUwAmEM%V z0f)m`A4oXoTX8t!!yJ$oO%6JU1B>D_J?E7xGS5t Q!u#Ni`0)N|>Q5#A0UK?K#sB~S literal 0 HcmV?d00001 diff --git a/Assets/Shaders/Trajectory_VS.shshaderb.shmeta b/Assets/Shaders/Trajectory_VS.shshaderb.shmeta new file mode 100644 index 00000000..74584b44 --- /dev/null +++ b/Assets/Shaders/Trajectory_VS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: Trajectory_VS +ID: 41042628 +Type: 2 diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h index 569818b9..38fe9aa3 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h @@ -64,6 +64,17 @@ namespace SHADE /***************************************************************************/ static constexpr std::string_view DEFERRED_COMPOSITE_PASS = "Deferred Comp Pass"; + /***************************************************************************/ + /*! + + \brief + Name of vfx render graph node. + + */ + /***************************************************************************/ + static constexpr std::string_view VFX_PASS = "Vfx Pass"; + + /***************************************************************************/ /*! @@ -117,6 +128,7 @@ namespace SHADE static constexpr std::string_view GBUFFER_WRITE_SUBPASS = "G-Buffer Write"; static constexpr std::string_view UI_SUBPASS = "UI"; + static constexpr std::string_view VFX_SUBPASS = "VFX"; static constexpr std::array USABLE_SUBPASSES = { diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 7d783490..976939ce 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -138,7 +138,8 @@ namespace SHADE //SHAssetManager::CompileAsset("../../Assets/Shaders/UI_VS.glsl", false); //SHAssetManager::CompileAsset("../../Assets/Shaders/UI_FS.glsl", false); //SHAssetManager::CompileAsset("../../Assets/Shaders/Text_VS.glsl", false); - + SHAssetManager::CompileAsset("../../Assets/Shaders/Trajectory_VS.glsl", false); + SHAssetManager::CompileAsset("../../Assets/Shaders/Trajectory_FS.glsl", false); // Load Built In Shaders static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet(VS_DEFAULT); @@ -154,8 +155,10 @@ namespace SHADE static constexpr AssetID TEXT_FS = 38024754; textFS = SHResourceManager::LoadOrGet(TEXT_FS); static constexpr AssetID RENDER_SC_VS = 48082949; renderToSwapchainVS = SHResourceManager::LoadOrGet(RENDER_SC_VS); static constexpr AssetID RENDER_SC_FS = 36869006; renderToSwapchainFS = SHResourceManager::LoadOrGet(RENDER_SC_FS); - static constexpr AssetID SHADOW_MAP_VS = 44646107; shadowMapVS = SHResourceManager::LoadOrGet(SHADOW_MAP_VS); - static constexpr AssetID SHADOW_MAP_FS = 45925790; shadowMapFS = SHResourceManager::LoadOrGet(SHADOW_MAP_FS); + static constexpr AssetID SHADOW_MAP_VS = 44646107; shadowMapVS = SHResourceManager::LoadOrGet(SHADOW_MAP_VS); + static constexpr AssetID SHADOW_MAP_FS = 45925790; shadowMapFS = SHResourceManager::LoadOrGet(SHADOW_MAP_FS); + static constexpr AssetID TRAJECTORY_VS = 41042628; trajectoryVS = SHResourceManager::LoadOrGet(TRAJECTORY_VS); + static constexpr AssetID TRAJECTORY_FS = 45635685; trajectoryFS = SHResourceManager::LoadOrGet(TRAJECTORY_FS); } @@ -308,13 +311,24 @@ namespace SHADE lightingSubSystem->PrepareShadowMapsForRead(cmdBuffer); }); + /*-----------------------------------------------------------------------*/ + /* VFX PASS */ + /*-----------------------------------------------------------------------*/ + auto vfxPass = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::VFX_PASS.data(), { "Scene", "Depth Buffer" }, { SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data() }); + auto vfxSubpass = vfxPass->AddSubpass("Vfx Subpass", worldViewport, worldRenderer); + vfxSubpass->AddColorOutput("Scene"); + vfxSubpass->AddDepthOutput("Depth Buffer"); + vfxSubpass->AddExteriorDrawCalls([=](Handle cmdBuffer, Handle renderer, uint32_t frameIndex) + { + trajectoryRenderingSubSystem->Render(cmdBuffer, renderer, frameIndex); + }); /*-----------------------------------------------------------------------*/ /* DEBUG DRAW PASS INIT */ /*-----------------------------------------------------------------------*/ // Set up Debug Draw Passes // - Depth Tested - auto debugDrawNodeDepth = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW_DEPTH_PASS.data(), {"Scene", "Depth Buffer"}, {SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data()}); + auto debugDrawNodeDepth = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW_DEPTH_PASS.data(), {"Scene", "Depth Buffer"}, { SHGraphicsConstants::RenderGraphEntityNames::VFX_PASS.data()/*, SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data()*/}); auto debugDrawDepthSubpass = debugDrawNodeDepth->AddSubpass("Debug Draw with Depth", worldViewport, worldRenderer); debugDrawDepthSubpass->AddColorOutput("Scene"); debugDrawDepthSubpass->AddDepthOutput("Depth Buffer"); @@ -435,8 +449,8 @@ namespace SHADE trajectoryRenderingSubSystem = resourceManager.Create(); - //auto gBufferNode = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data()); - //trajectoryRenderingSubSystem->Init(device, ) + auto vfxNode = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data()); + trajectoryRenderingSubSystem->Init(device, vfxNode->GetRenderpass(), vfxNode->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::UI_SUBPASS), trajectoryVS, trajectoryFS); SHGlobalDescriptorSets::SetLightingSubSystem(lightingSubSystem); @@ -572,6 +586,7 @@ namespace SHADE } textRenderingSubSystem->Run(frameIndex); + trajectoryRenderingSubSystem->Run(frameIndex); for (auto renderer : renderers) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index 0576233f..21d18be1 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -471,6 +471,8 @@ namespace SHADE Handle renderToSwapchainFS; Handle shadowMapVS; Handle shadowMapFS; + Handle trajectoryVS; + Handle trajectoryFS; // Fonts Handle testFont; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderableComponent.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderableComponent.cpp index 9401d076..77dd66c8 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderableComponent.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderableComponent.cpp @@ -62,6 +62,11 @@ namespace SHADE mesh = newMesh; } + void SHTrajectoryRenderableComponent::SetPositions(std::vector const& inPositions) noexcept + { + positions = inPositions; + } + void SHTrajectoryRenderableComponent::SetStartColor(SHVec4 color) noexcept { startColor = color; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderableComponent.h b/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderableComponent.h index ac0343d4..d6f7be12 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderableComponent.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderableComponent.h @@ -26,7 +26,7 @@ namespace SHADE //! Color the trajectory should evolve to the longer it is SHVec4 endColor; - //! evolving rate of the color (with respect to dt) + //! evolving rate of the color float colorEvolveRate; public: @@ -34,6 +34,7 @@ namespace SHADE /* PRIVATE MEMBER FUNCTIONS */ /*-----------------------------------------------------------------------*/ void SetMesh(Handle newMesh) noexcept; + void SetPositions (std::vector const& inPositions) noexcept; void SetStartColor(SHVec4 startColor) noexcept; void SetEndColor (SHVec4 endColor) noexcept; void SetColorEvolveRate (float rate) noexcept; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.cpp index 9eaca200..740ffa92 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.cpp @@ -70,11 +70,17 @@ namespace SHADE pipeline->GetPipelineState().SetColorBlenState(colorBlendState); } - void SHTrajectoryRenderingSubSystem::Run(uint32_t frameIndex, float dt) noexcept + void SHTrajectoryRenderingSubSystem::Run(uint32_t frameIndex) noexcept { auto& comps = SHComponentManager::GetDense(); for (auto& comp : comps) { + comp.SetPositions(std::vector + { + SHVec3 {}, + SHVec3 {} + }); + // If has positions, feed data to buffer. if (comp.HasPositions()) { @@ -115,7 +121,7 @@ namespace SHADE currentColor = SHVec4::Lerp(startColor, endColor, lerpValue); // evolve lerp value and clamp to 1 - lerpValue = std::max (1.0f, lerpValue + (colorEvolveRate * dt)); + lerpValue = std::max (1.0f, lerpValue + colorEvolveRate); } // add draw data for this trajectory @@ -134,40 +140,46 @@ namespace SHADE comp.ClearPositions(); } - // read transform data to buffer - // read draw data to buffer - SHVkUtil::EnsureBufferAndCopyHostVisibleData(logicalDevice, transformBuffer, transformData.data(), sizeof (SHMatrix) * transformData.size(), vk::BufferUsageFlagBits::eVertexBuffer, "Trajectory System Transform Buffer"); + if (!transformData.empty()) + { + // read transform data to buffer + // read draw data to buffer + SHVkUtil::EnsureBufferAndCopyHostVisibleData(logicalDevice, transformBuffer, transformData.data(), sizeof (SHMatrix) * transformData.size(), vk::BufferUsageFlagBits::eVertexBuffer, "Trajectory System Transform Buffer"); - SHVkUtil::EnsureBufferAndCopyHostVisibleData(logicalDevice, drawDataBuffer, drawData.data(), sizeof(vk::DrawIndexedIndirectCommand) * drawData.size(), vk::BufferUsageFlagBits::eIndirectBuffer, "Trajectory System Draw Data Buffer"); + SHVkUtil::EnsureBufferAndCopyHostVisibleData(logicalDevice, drawDataBuffer, drawData.data(), sizeof(vk::DrawIndexedIndirectCommand) * drawData.size(), vk::BufferUsageFlagBits::eIndirectBuffer, "Trajectory System Draw Data Buffer"); - SHVkUtil::EnsureBufferAndCopyHostVisibleData(logicalDevice, colorBuffer, colorData.data(), sizeof(SHVec4) * colorData.size(), vk::BufferUsageFlagBits::eVertexBuffer, "Trajectory System Color Data Buffer"); + SHVkUtil::EnsureBufferAndCopyHostVisibleData(logicalDevice, colorBuffer, colorData.data(), sizeof(SHVec4) * colorData.size(), vk::BufferUsageFlagBits::eVertexBuffer, "Trajectory System Color Data Buffer"); + } } void SHTrajectoryRenderingSubSystem::Render(Handle cmdBuffer, Handle renderer, uint32_t frameIndex) noexcept { - auto const& mappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::TRAJECTORY_RENDERING); - uint32_t staticGlobalSetIndex = mappings.at(SHPredefinedDescriptorTypes::STATIC_DATA); - uint32_t cameraSetIndex = mappings.at(SHPredefinedDescriptorTypes::CAMERA); + if (!transformData.empty()) + { + auto const& mappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::TRAJECTORY_RENDERING); + uint32_t staticGlobalSetIndex = mappings.at(SHPredefinedDescriptorTypes::STATIC_DATA); + uint32_t cameraSetIndex = mappings.at(SHPredefinedDescriptorTypes::CAMERA); - cmdBuffer->BindPipeline(pipeline); + cmdBuffer->BindPipeline(pipeline); - // Bind global data - SHGlobalDescriptorSets::BindStaticGlobalData(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex); + // Bind global data + SHGlobalDescriptorSets::BindStaticGlobalData(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex); - // Bind camera data - renderer->BindDescriptorSet(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, cameraSetIndex, frameIndex); + // Bind camera data + renderer->BindDescriptorSet(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, cameraSetIndex, frameIndex); - // Bind color vertex buffer - cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::TRAJECTORY_COLOR, colorBuffer, 0); + // Bind color vertex buffer + cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::TRAJECTORY_COLOR, colorBuffer, 0); - // call draw call - cmdBuffer->DrawMultiIndirect(drawDataBuffer, drawData.size()); + // call draw call + cmdBuffer->DrawMultiIndirect(drawDataBuffer, drawData.size()); - // clear CPU transform and draw data - transformData.clear(); - drawData.clear(); - colorData.clear(); + // clear CPU transform and draw data + transformData.clear(); + drawData.clear(); + colorData.clear(); + } } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.h index 2bba5703..12db99a0 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.h @@ -57,7 +57,7 @@ namespace SHADE public: void Init (Handle device, Handle compatibleRenderpass, Handle subpass, Handle textVS, Handle textFS) noexcept; - void Run(uint32_t frameIndex, float dt) noexcept; + void Run(uint32_t frameIndex) noexcept; void Render(Handle cmdBuffer, Handle renderer, uint32_t frameIndex) noexcept; void Exit(void) noexcept;