From da59f0ceb04e9cc778d9729ac919ccb49594c925 Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Sun, 6 Feb 2022 21:49:00 +0100 Subject: [PATCH] Added slider for particle count Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- .../shaders/init_particle_weights.comp | 4 +- projects/wobble_bobble/shaders/particle.inc | 1 + .../shaders/transform_particles_to_grid.comp | 4 +- .../shaders/update_particle_velocities.comp | 6 +- projects/wobble_bobble/src/main.cpp | 155 +++++++++++++----- 5 files changed, 123 insertions(+), 47 deletions(-) diff --git a/projects/wobble_bobble/shaders/init_particle_weights.comp b/projects/wobble_bobble/shaders/init_particle_weights.comp index 3530bfa1..1ab68813 100644 --- a/projects/wobble_bobble/shaders/init_particle_weights.comp +++ b/projects/wobble_bobble/shaders/init_particle_weights.comp @@ -9,8 +9,8 @@ layout(set=0, binding=0, std430) restrict buffer particleBuffer { Particle particles []; }; -layout(set=0, binding=1) uniform texture3D gridImage; -layout(set=0, binding=2) uniform sampler gridSampler; +layout(set=1, binding=0) uniform texture3D gridImage; +layout(set=1, binding=1) uniform sampler gridSampler; void main() { if (gl_GlobalInvocationID.x < particles.length()) { diff --git a/projects/wobble_bobble/shaders/particle.inc b/projects/wobble_bobble/shaders/particle.inc index 92ce70eb..a622485e 100644 --- a/projects/wobble_bobble/shaders/particle.inc +++ b/projects/wobble_bobble/shaders/particle.inc @@ -42,6 +42,7 @@ struct Simulation { float gamma; int mode; float gravity; + int count; }; const float PI = 3.1415926535897932384626433832795; diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp index 71d342e1..b37955cc 100644 --- a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp +++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp @@ -9,11 +9,11 @@ layout(set=0, binding=0, std430) readonly buffer particleBuffer { Particle particles []; }; -layout(set=0, binding=1) uniform simulationBlock { +layout(set=1, binding=0) uniform simulationBlock { Simulation simulation; }; -layout(set=0, binding=2, rgba16f) restrict writeonly uniform image3D gridImage; +layout(set=2, binding=0, rgba16f) restrict writeonly uniform image3D gridImage; layout( push_constant ) uniform constants { float t; diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp index 60b5a72e..409e7e37 100644 --- a/projects/wobble_bobble/shaders/update_particle_velocities.comp +++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp @@ -10,12 +10,12 @@ layout(set=0, binding=0, std430) restrict buffer particleBuffer { Particle particles []; }; -layout(set=0, binding=1) uniform simulationBlock { +layout(set=1, binding=0) uniform simulationBlock { Simulation simulation; }; -layout(set=0, binding=2) uniform texture3D gridImage; -layout(set=0, binding=3) uniform sampler gridSampler; +layout(set=2, binding=0) uniform texture3D gridImage; +layout(set=2, binding=1) uniform sampler gridSampler; layout( push_constant ) uniform constants { float t; diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp index 6fd28707..baba070e 100644 --- a/projects/wobble_bobble/src/main.cpp +++ b/projects/wobble_bobble/src/main.cpp @@ -42,6 +42,7 @@ struct Simulation { float gamma; int mode; float gravity; + int count; }; struct Physics { @@ -235,8 +236,13 @@ vkcv::ComputePipelineHandle createComputePipeline(vkcv::Core& core, vkcv::shader return core.createComputePipeline(config); } -void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity, +vkcv::BufferHandle resetParticles(vkcv::Core& core, size_t count, const glm::vec3& velocity, float density, float size, int form, int mode) { + vkcv::Buffer<Particle> particles = core.createBuffer<Particle>( + vkcv::BufferType::STORAGE, + count + ); + std::vector<Particle> particles_vec (particles.getCount()); switch (form) { @@ -267,6 +273,7 @@ void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity } particles.fill(particles_vec); + return particles.getHandle(); } int main(int argc, const char **argv) { @@ -302,16 +309,11 @@ int main(int argc, const char **argv) { swapchainExtent.height ).getHandle(); - vkcv::Buffer<Particle> particles = core.createBuffer<Particle>( - vkcv::BufferType::STORAGE, - 1024 - ); - vkcv::Image grid = core.createImage( vk::Format::eR16G16B16A16Sfloat, - 64, - 64, - 64, + 32, + 32, + 32, false, true ); @@ -344,8 +346,17 @@ int main(int argc, const char **argv) { sim->gamma = 1.330f; sim->mode = SIM_MODE_RANDOM; sim->gravity = 9.81f; - - resetParticles(particles, initialVelocity, sim->density, sim->size, sim->form, sim->mode); + sim->count = 1024; + + vkcv::BufferHandle particlesHandle = resetParticles( + core, + sim->count, + initialVelocity, + sim->density, + sim->size, + sim->form, + sim->mode + ); vkcv::shader::GLSLCompiler compiler; @@ -358,12 +369,17 @@ int main(int argc, const char **argv) { { vkcv::DescriptorWrites writes; - writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle())); - writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, grid.getHandle())); - writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(2, gridSampler)); + writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle)); core.writeDescriptorSet(initParticleWeightsSets[0], writes); } + { + vkcv::DescriptorWrites writes; + writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(0, grid.getHandle())); + writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(1, gridSampler)); + core.writeDescriptorSet(initParticleWeightsSets[1], writes); + } + std::vector<vkcv::DescriptorSetHandle> transformParticlesToGridSets; vkcv::ComputePipelineHandle transformParticlesToGridPipeline = createComputePipeline( core, compiler, @@ -373,12 +389,22 @@ int main(int argc, const char **argv) { { vkcv::DescriptorWrites writes; - writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle())); - writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(1, simulation.getHandle())); - writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(2, grid.getHandle())); + writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle)); core.writeDescriptorSet(transformParticlesToGridSets[0], writes); } + { + vkcv::DescriptorWrites writes; + writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, simulation.getHandle())); + core.writeDescriptorSet(transformParticlesToGridSets[1], writes); + } + + { + vkcv::DescriptorWrites writes; + writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(0, grid.getHandle())); + core.writeDescriptorSet(transformParticlesToGridSets[2], writes); + } + std::vector<vkcv::DescriptorSetHandle> updateParticleVelocitiesSets; vkcv::ComputePipelineHandle updateParticleVelocitiesPipeline = createComputePipeline( core, compiler, @@ -388,13 +414,23 @@ int main(int argc, const char **argv) { { vkcv::DescriptorWrites writes; - writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle())); - writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(1, simulation.getHandle())); - writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(2, grid.getHandle())); - writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(3, gridSampler)); + writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle)); core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes); } + { + vkcv::DescriptorWrites writes; + writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, simulation.getHandle())); + core.writeDescriptorSet(updateParticleVelocitiesSets[1], writes); + } + + { + vkcv::DescriptorWrites writes; + writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(0, grid.getHandle())); + writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(1, gridSampler)); + core.writeDescriptorSet(updateParticleVelocitiesSets[2], writes); + } + vkcv::ShaderProgram gfxProgramGrid; compiler.compile( @@ -510,7 +546,7 @@ int main(int argc, const char **argv) { { vkcv::DescriptorWrites writes; - writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle())); + writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle)); core.writeDescriptorSet(gfxSetParticles, writes); } @@ -629,7 +665,7 @@ int main(int argc, const char **argv) { drawcallsParticles.push_back(vkcv::DrawcallInfo( triangleMesh, { vkcv::DescriptorSetUsage(0, core.getDescriptorSet(gfxSetParticles).vulkanHandle) }, - particles.getCount() + sim->count )); std::vector<vkcv::DrawcallInfo> drawcallsLines; @@ -693,37 +729,50 @@ int main(int argc, const char **argv) { auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics); const uint32_t dispatchSizeGrid[3] = {grid.getWidth() / 4, grid.getHeight() / 4, grid.getDepth() / 4}; - const uint32_t dispatchSizeParticles[3] = {static_cast<uint32_t>(particles.getCount() + 63) / 64, 1, 1}; + const uint32_t dispatchSizeParticles[3] = {static_cast<uint32_t>(sim->count + 63) / 64, 1, 1}; for (int step = 0; step < 1; step++) { core.recordBeginDebugLabel(cmdStream, "INIT PARTICLE WEIGHTS", {0.78f, 0.89f, 0.94f, 1.0f}); - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.recordBufferMemoryBarrier(cmdStream, particlesHandle); core.prepareImageForSampling(cmdStream, grid.getHandle()); core.recordComputeDispatchToCmdStream( cmdStream, initParticleWeightsPipeline, dispatchSizeParticles, - {vkcv::DescriptorSetUsage( - 0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle - )}, + { + vkcv::DescriptorSetUsage( + 0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle + ), + vkcv::DescriptorSetUsage( + 1, core.getDescriptorSet(initParticleWeightsSets[1]).vulkanHandle + ) + }, vkcv::PushConstants(0) ); - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.recordBufferMemoryBarrier(cmdStream, particlesHandle); core.recordEndDebugLabel(cmdStream); core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", {0.47f, 0.77f, 0.85f, 1.0f}); - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.recordBufferMemoryBarrier(cmdStream, particlesHandle); core.prepareImageForStorage(cmdStream, grid.getHandle()); core.recordComputeDispatchToCmdStream( cmdStream, transformParticlesToGridPipeline, dispatchSizeGrid, - {vkcv::DescriptorSetUsage( - 0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle - )}, + { + vkcv::DescriptorSetUsage( + 0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle + ), + vkcv::DescriptorSetUsage( + 1, core.getDescriptorSet(transformParticlesToGridSets[1]).vulkanHandle + ), + vkcv::DescriptorSetUsage( + 2, core.getDescriptorSet(transformParticlesToGridSets[2]).vulkanHandle + ) + }, physicsPushConstants ); @@ -731,7 +780,7 @@ int main(int argc, const char **argv) { core.recordEndDebugLabel(cmdStream); core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE VELOCITIES", {0.78f, 0.89f, 0.94f, 1.0f}); - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.recordBufferMemoryBarrier(cmdStream, particlesHandle); core.recordBufferMemoryBarrier(cmdStream, simulation.getHandle()); core.prepareImageForSampling(cmdStream, grid.getHandle()); @@ -739,13 +788,21 @@ int main(int argc, const char **argv) { cmdStream, updateParticleVelocitiesPipeline, dispatchSizeParticles, - {vkcv::DescriptorSetUsage( - 0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle - )}, + { + vkcv::DescriptorSetUsage( + 0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle + ), + vkcv::DescriptorSetUsage( + 1, core.getDescriptorSet(updateParticleVelocitiesSets[1]).vulkanHandle + ), + vkcv::DescriptorSetUsage( + 2, core.getDescriptorSet(updateParticleVelocitiesSets[2]).vulkanHandle + ) + }, physicsPushConstants ); - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.recordBufferMemoryBarrier(cmdStream, particlesHandle); core.recordEndDebugLabel(cmdStream); } @@ -772,7 +829,7 @@ int main(int argc, const char **argv) { core.recordEndDebugLabel(cmdStream); } else { core.recordBeginDebugLabel(cmdStream, "RENDER PARTICLES", { 0.13f, 0.20f, 0.22f, 1.0f }); - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.recordBufferMemoryBarrier(cmdStream, particlesHandle); core.recordDrawcallsToCmdStream( cmdStream, @@ -815,6 +872,7 @@ int main(int argc, const char **argv) { ImGui::Spacing(); + ImGui::SliderInt("Particle Count", &(sim->count), 1, 100000); ImGui::SliderFloat("Density", &(sim->density), std::numeric_limits<float>::epsilon(), 5000.0f); ImGui::SameLine(0.0f, 10.0f); if (ImGui::SmallButton("Reset##density")) { @@ -847,7 +905,24 @@ int main(int argc, const char **argv) { ImGui::DragFloat3("Initial Velocity", reinterpret_cast<float*>(&initialVelocity), 0.001f); ImGui::SameLine(0.0f, 10.0f); if (ImGui::Button("Reset##particle_velocity")) { - resetParticles(particles, initialVelocity, sim->density, sim->size, sim->form, sim->mode); + particlesHandle = resetParticles( + core, + sim->count, + initialVelocity, + sim->density, + sim->size, + sim->form, + sim->mode + ); + + vkcv::DescriptorWrites writes; + writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle)); + + core.writeDescriptorSet(initParticleWeightsSets[0], writes); + core.writeDescriptorSet(transformParticlesToGridSets[0], writes); + core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes); + + core.writeDescriptorSet(gfxSetParticles, writes); } ImGui::SliderFloat("Gravity", &(sim->gravity), 0.0f, 10.0f); -- GitLab