Particles WIP

This commit is contained in:
Brandon Mak 2023-03-14 19:34:26 +08:00
parent 070f01bf67
commit 69fc997361
9 changed files with 37 additions and 16 deletions

View File

@ -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);

View File

@ -132,5 +132,7 @@ void main()
outputParticles.data[index] = particle;
uint drawIndex = atomicAdd (indirectArgs.instanceCount, 1);
indices[drawIndex] = index;
// indirectArgs.instanceCount = 1;
}
}

View File

@ -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);
}

Binary file not shown.

View File

@ -462,7 +462,7 @@ namespace SHADE
vkCommandBuffer.drawIndexedIndirect(indirectDrawData->GetVkBuffer(), 0, drawCount, sizeof(vk::DrawIndexedIndirectCommand));
}
void SHVkCommandBuffer::DrawMultiIndirect(Handle<SHVkBuffer> indirectDrawData, uint32_t drawCount)
void SHVkCommandBuffer::DrawMultiIndirect(Handle<SHVkBuffer> 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));
}

View File

@ -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<SHVkBuffer> indirectDrawData, uint32_t drawCount);
void DrawMultiIndirect (Handle<SHVkBuffer> indirectDrawData, uint32_t drawCount);
void DrawMultiIndirect (Handle<SHVkBuffer> indirectDrawData, uint32_t drawCount, uint32_t offset = 0);
// Compute Commands
void ComputeDispatch (uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) noexcept;

View File

@ -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<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex)
{
particleSubSystem->Run(cmdBuffer, frameIndex);
});
//vfxPass->AddPreBeginFunction([=](Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex)
// {
// particleSubSystem->Run(cmdBuffer, frameIndex);
// });
vfxSubpass->AddColorOutput("Scene");
vfxSubpass->AddDepthOutput("Depth Buffer");
vfxSubpass->AddExteriorDrawCalls([=](Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHRenderer> 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);

View File

@ -166,7 +166,8 @@ namespace SHADE
void SHParticleSubSystem::RenderComponent(Handle<SHVkCommandBuffer> cmdBuffer, SHParticleEmitterComponent& comp, uint32_t frameIndex) noexcept
{
cmdBuffer->DrawMultiIndirect(comp.drawCallData, 1);
cmdBuffer->DrawMultiIndirect(comp.drawCallData, 1, static_cast<uint32_t>(sizeof(vk::DrawIndirectCommand)) * frameIndex);
//cmdBuffer->DrawArrays(4, 1, 0, 0);
}
void SHParticleSubSystem::PreparePrePostUpdateBarriers(std::vector<vk::BufferMemoryBarrier>& preUpdateBarriers, std::vector<vk::BufferMemoryBarrier>& postUpdateBarriers, SHParticleEmitterComponent const& emitter, uint32_t const EMITTER_INDEX, uint32_t const FRAME_INDEX) noexcept
@ -215,10 +216,20 @@ namespace SHADE
.size = static_cast<uint32_t>(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<uint32_t>(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<vk::BufferMemoryBarrier> 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.