From 69fc9973616a6fd81bfe80546476b3516034680b Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Tue, 14 Mar 2023 19:34:26 +0800 Subject: [PATCH] Particles WIP --- Assets/Shaders/ParticleEmit_CS.glsl | 2 +- Assets/Shaders/ParticleEmit_CS.shshaderb | Bin 7685 -> 7685 bytes Assets/Shaders/ParticleUpdate_CS.glsl | 2 ++ Assets/Shaders/Particle_VS.glsl | 7 +++-- Assets/Shaders/Particle_VS.shshaderb | Bin 6005 -> 5869 bytes .../Graphics/Commands/SHVkCommandBuffer.cpp | 4 +-- .../src/Graphics/Commands/SHVkCommandBuffer.h | 2 +- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 10 +++---- .../Particles/SHParticleSubSystem.cpp | 26 +++++++++++++++--- 9 files changed, 37 insertions(+), 16 deletions(-) diff --git a/Assets/Shaders/ParticleEmit_CS.glsl b/Assets/Shaders/ParticleEmit_CS.glsl index f54a58fa..6c65ff83 100644 --- a/Assets/Shaders/ParticleEmit_CS.glsl +++ b/Assets/Shaders/ParticleEmit_CS.glsl @@ -135,7 +135,7 @@ void main() // Set size of particle particle.scaleAndDecay.x = emitterParams.data.lifeAndSizeRange.z; - particle.scaleAndDecay.y = emitterParams.data.lifeAndSizeRange.z; + particle.scaleAndDecay.z = emitterParams.data.lifeAndSizeRange.z; particle.rotation = vec4 (5.0f); particle.acceleration = vec4 (0.01f); diff --git a/Assets/Shaders/ParticleEmit_CS.shshaderb b/Assets/Shaders/ParticleEmit_CS.shshaderb index 8e2eba23cc690b20ad995dc63d858c62bda47d8f..898baf45d9f8cfbeb4c6f34f99c06f4751117f51 100644 GIT binary patch delta 14 VcmZp*X|>rfRgCfG=4oR2>;Nnn1&sgz delta 14 VcmZp*X|>rfRgAG`^E9!1b^t0$1wa4* diff --git a/Assets/Shaders/ParticleUpdate_CS.glsl b/Assets/Shaders/ParticleUpdate_CS.glsl index 89c0ae6c..33da0d5e 100644 --- a/Assets/Shaders/ParticleUpdate_CS.glsl +++ b/Assets/Shaders/ParticleUpdate_CS.glsl @@ -132,5 +132,7 @@ void main() outputParticles.data[index] = particle; uint drawIndex = atomicAdd (indirectArgs.instanceCount, 1); indices[drawIndex] = index; + + // indirectArgs.instanceCount = 1; } } \ No newline at end of file diff --git a/Assets/Shaders/Particle_VS.glsl b/Assets/Shaders/Particle_VS.glsl index 07594fbe..d5703c82 100644 --- a/Assets/Shaders/Particle_VS.glsl +++ b/Assets/Shaders/Particle_VS.glsl @@ -78,16 +78,17 @@ void main() vec2 particleScaleData = particle.scaleAndDecay.xz; // x and y mat4 localModel = mat4 (1.0f); - localModel[0][0] = particleScaleData.x; - localModel[1][1] = particleScaleData.y; + localModel[0][0] = 1.0f; + localModel[1][1] = 1.0f; mat4 rotate = mat4(1.0f); rotate[0][0] = cos(angle); rotate[0][1] = sin(angle); rotate[1][0] = -sin(angle); rotate[1][1] = cos(angle); - localModel = rotate * localModel; + // localModel = rotate * localModel; localModel[3] = vec4 (particle.position.xyz, 1.0f); gl_Position = cameraData.vpMat * localModel * vec4(vertexPos, 1.0f); + // gl_Position = vec4(vertexPos, 1.0f); } \ No newline at end of file diff --git a/Assets/Shaders/Particle_VS.shshaderb b/Assets/Shaders/Particle_VS.shshaderb index 00b333cb2a3486c787210690902f87fce0516b70..82cb32311ab8fc2a4094ab06865219819200ad59 100644 GIT binary patch delta 1866 zcmZ9LyH6BR7{%|f4}7r1!~_ZwBhY9eMy-gV;Sr(Gh+-@(G!q!iAh4Td1*KrX_gi3n zf+D`rRg9sqv-F>^wXv|&+Vh*43mfm|2d`={ymjvD7@jR{wxqOsB#$80be z^LeJG$C>*wFrU~yC1*Zca0{L>DU&vjWuF;5-R{Np4c>eu_;;GjMs@3S%0|D z&1-LWhrGPo;TGJe1{^Dw9q|i( zc9?TI)>3seci1hIaa0@iy)js;ONh(mvjcF{c_zCzs&go_yJe8_*O2zS1-L8-Fm*r_Y*Wd5u#nB8tR$o|^p)1Yu z%J7v1$!TvEjCdsKF+#Td)P;{*R-{@;GebrcJOG2x$YEgicA;sjhjs27%74U9U5X z!lmdKCN1aCQ;6HKI@|O*I7`}&s$!viF@jk%1ZNvs)|rM_G_<_Zw*E&VcqEg&gTfX) zJ+HAZ=J0{7l0VT-N&I_bn|}lxam-HKSQ&_WDw`JY6Nk;+z{%fW7Gi@y0^VyUDalA& zDt^n<)-wrLhT@ZU!r@4Xy7mR8VVh7Z>{nX2I-ymG(M$?x z_>8y#G?UuVaGugWA+)Frw{%fBD^w{S`;y=Y)dIdSFGVg31eX_wBfuuRqH}q&tFlR! z5%Ae2ujy=a*(Tx8+g#Umwz-<=?1o^I;SAylZpJ>F{FZEza|5--h0QwyX1Og`#a*4P z!j^}-6KYcCnD%?Z0fBL8iN~83;E(90c4?o9Id~S`@r+0HZ=mB@K^ksvjVwlFD7M1; zF-LH>{(uyFAdmn({^*gT<{rxCkxvRdDmMC773S-EF7Qcm1uZ5>hTrg_3>-|ur};u4 z$*h8~UkZx?JQ^l^CF~JwqpxF5+bZ`a=9u2<-o{)w(4lyucOpqZ00JhOQE{eS5@-Mo WQ}CbpAn=Fe378UlX=Qg!yYmn2#@G1( delta 2025 zcmZ9MNlz3}6op^eG@ybpF~WkxIK)I3YKV!^I7Kw##)v~)xX@IfFoiAMX<8f>mJ`ks zv@=dP&tfCGGp_s-{sI>+b!X!Fs_SCKM^4_o=g#*P{d3W;#Z6wW*~KR_XFU?o{pfnGbomVL&Vm?mlxMGufXah9{I4h zv^_kcI6Ug&$VpY(`dnDp5cZY)-p-(ED<7?CiAHeM$?ETs?)Coupy+S#OMbNm9H)@) z3rk_X7r8d^rD}g+vtLSaRO=6egRth85mzYYd*G<^M0#hn&c?V9WJP3q&>IxP&bWH5 ztBE<$u1ggd7$1rTIls^sbnOWDS4XLocV}C?O8H2(rFBg9RGzj2-Q7V^9L-?kbj4K} zy3UP{ean9KBDTnxTD{yR8Evz0lr@eS;h4)fWVjlkT^3^T!)`mAC!MoNUU1~h#(FlI zAaI&qB_}w2BnejyBykcL`=AroAy`4U|Kn&f9fwZbRTupWgtR~=p;MBzt7~3vu0ZFe z&ymcbFb~8bDaSbc;nSBfs=i%dzvT&5-_Tp zLL?(`rTnF_c@C4XGCV%&CLE5G=;P(zjlrSLj|!IHwB&t4 zgBqc+GlC~f6R=t0vyzETHwcHncaCOi>Xw{75g!khj=I!SCJ zFD2sxj}H^R5|#?q=<9^jHNm}+9O0Or=&f|P^hEEZlYjv1Of;y5nfARv1Nbn+sO}HK ch`&!*oU!Z5~z5oCK diff --git a/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.cpp b/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.cpp index 3aea863c..2ba35ad7 100644 --- a/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.cpp +++ b/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.cpp @@ -462,7 +462,7 @@ namespace SHADE vkCommandBuffer.drawIndexedIndirect(indirectDrawData->GetVkBuffer(), 0, drawCount, sizeof(vk::DrawIndexedIndirectCommand)); } - void SHVkCommandBuffer::DrawMultiIndirect(Handle indirectDrawData, uint32_t drawCount) + void SHVkCommandBuffer::DrawMultiIndirect(Handle indirectDrawData, uint32_t drawCount, uint32_t offset/* = 0*/) { if (cmdBufferState != SH_CMD_BUFFER_STATE::RECORDING) { @@ -471,7 +471,7 @@ namespace SHADE } if (indirectDrawData) - vkCommandBuffer.drawIndirect(indirectDrawData->GetVkBuffer(), 0, drawCount, sizeof(vk::DrawIndexedIndirectCommand)); + vkCommandBuffer.drawIndirect(indirectDrawData->GetVkBuffer(), offset, drawCount, sizeof(vk::DrawIndirectCommand)); } diff --git a/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.h b/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.h index c42ff33c..510dcc3b 100644 --- a/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.h +++ b/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.h @@ -131,7 +131,7 @@ namespace SHADE void DrawArrays (uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) const noexcept; void DrawIndexed (uint32_t indexCount, uint32_t firstIndex, uint32_t vertexOffset) const noexcept; void DrawMultiIndirectIndexed (Handle indirectDrawData, uint32_t drawCount); - void DrawMultiIndirect (Handle indirectDrawData, uint32_t drawCount); + void DrawMultiIndirect (Handle indirectDrawData, uint32_t drawCount, uint32_t offset = 0); // Compute Commands void ComputeDispatch (uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) noexcept; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 62e3c455..57b373dd 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -352,10 +352,10 @@ namespace SHADE /*-----------------------------------------------------------------------*/ 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(SHGraphicsConstants::RenderGraphEntityNames::VFX_SUBPASS.data(), worldViewport, worldRenderer); - vfxPass->AddPreBeginFunction([=](Handle cmdBuffer, uint32_t frameIndex) - { - particleSubSystem->Run(cmdBuffer, frameIndex); - }); + //vfxPass->AddPreBeginFunction([=](Handle cmdBuffer, uint32_t frameIndex) + // { + // particleSubSystem->Run(cmdBuffer, frameIndex); + // }); vfxSubpass->AddColorOutput("Scene"); vfxSubpass->AddDepthOutput("Depth Buffer"); vfxSubpass->AddExteriorDrawCalls([=](Handle cmdBuffer, Handle renderer, uint32_t frameIndex) @@ -689,7 +689,6 @@ namespace SHADE textRenderingSubSystem->Run(frameIndex); trajectoryRenderingSubSystem->Run(frameIndex); - for (auto renderer : renderers) { #ifdef SHEDITOR @@ -711,6 +710,7 @@ namespace SHADE renderGraph->Begin(frameIndex); auto cmdBuffer = renderGraph->GetCommandBuffer(frameIndex); + particleSubSystem->Run(cmdBuffer, frameIndex); renderGraph->Execute(frameIndex, descPool, MESH_DATA); renderGraph->End(frameIndex); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleSubSystem.cpp index 5e526ae2..8e1ce707 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleSubSystem.cpp @@ -166,7 +166,8 @@ namespace SHADE void SHParticleSubSystem::RenderComponent(Handle cmdBuffer, SHParticleEmitterComponent& comp, uint32_t frameIndex) noexcept { - cmdBuffer->DrawMultiIndirect(comp.drawCallData, 1); + cmdBuffer->DrawMultiIndirect(comp.drawCallData, 1, static_cast(sizeof(vk::DrawIndirectCommand)) * frameIndex); + //cmdBuffer->DrawArrays(4, 1, 0, 0); } void SHParticleSubSystem::PreparePrePostUpdateBarriers(std::vector& preUpdateBarriers, std::vector& postUpdateBarriers, SHParticleEmitterComponent const& emitter, uint32_t const EMITTER_INDEX, uint32_t const FRAME_INDEX) noexcept @@ -215,10 +216,20 @@ namespace SHADE .size = static_cast(sizeof(uint32_t)) * emitter.maxParticles }; + // make new barrier on stack... + vk::BufferMemoryBarrier drawDataBarrier + { + .srcAccessMask = vk::AccessFlagBits::eShaderWrite, + .dstAccessMask = vk::AccessFlagBits::eShaderRead, + .buffer = emitter.drawCallData->GetVkBuffer(), + .offset = emitter.dynamicOffsets[FRAME_INDEX][DYOFF_INDEX_DRAW_DATA], + .size = static_cast(sizeof(vk::DrawIndirectCommand)) + }; // ...copy assign barriers on heap - postUpdateBarriers[EMITTER_INDEX * 2] = particleDataBarrierPost; - postUpdateBarriers[(EMITTER_INDEX * 2) + 1] = indicesDataBarrier; + postUpdateBarriers[EMITTER_INDEX * 3] = particleDataBarrierPost; + postUpdateBarriers[(EMITTER_INDEX * 3) + 1] = indicesDataBarrier; + postUpdateBarriers[(EMITTER_INDEX * 3) + 2] = drawDataBarrier; } @@ -264,6 +275,13 @@ namespace SHADE } renderingPipelineData.pipeline->GetPipelineState().SetColorBlenState(colorBlendState); + + // Sets the input assembly state for rendering particles + SHInputAssemblyState inputAssemblyState{}; + inputAssemblyState.topology = vk::PrimitiveTopology::eTriangleFan; + renderingPipelineData.pipeline->GetPipelineState().SetInputAssemblyState(inputAssemblyState); + + renderingPipelineData.pipeline->ConstructPipeline(); SHPipelineLayoutParams emitPlParams @@ -314,7 +332,7 @@ namespace SHADE // After we invoke the updates for the emitters, we need to make sure all particles and indices data are done updating // before we issue them for rendering. std::vector postUpdateBarriers{}; - postUpdateBarriers.resize(emitters.size() * 2); + postUpdateBarriers.resize(emitters.size() * 3); // If we wanted to be VERY safe, a barrier would be good here to make sure output particles have finish reading input particles in // the update compute. HOWEVER since a NUM_FRAME_BUFFERS frames would have passed by then, we will not insert 1 here.