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 8e2eba23..898baf45 100644 Binary files a/Assets/Shaders/ParticleEmit_CS.shshaderb and b/Assets/Shaders/ParticleEmit_CS.shshaderb differ 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 00b333cb..82cb3231 100644 Binary files a/Assets/Shaders/Particle_VS.shshaderb and b/Assets/Shaders/Particle_VS.shshaderb differ 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.