diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp index 7277e586fc746006f121dd7a439e4ff46ead3971..5b16b41557178d39cf17eb7c91b9748e9503ba5b 100644 --- a/projects/wobble_bobble/shaders/update_particle_velocities.comp +++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp @@ -1,6 +1,29 @@ #version 450 +#extension GL_GOOGLE_include_directive : enable layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in; +#include "particle.inc" + +layout(set=0, binding=0, std430) buffer particleBuffer { + Particle particles []; +}; + +layout(set=0, binding=1) uniform texture3D gridImage; +layout(set=0, binding=2) uniform sampler gridSampler; + void main() { + if (gl_GlobalInvocationID.x < particles.length()) { + vec3 position = particles[gl_GlobalInvocationID.x].minimal.position; + float mass = particles[gl_GlobalInvocationID.x].minimal.mass; + + vec3 offset = position; + + vec4 gridSample = texture(sampler3D(gridImage, gridSampler), offset); + + vec3 gridVelocity = gridSample.xyz; + float gridMass = gridSample.w; + + particles[gl_GlobalInvocationID.x].minimal.velocity = gridVelocity * mass / gridMass; + } } \ No newline at end of file diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp index 9148b3c80dbc116176f7039af9c4dc9ce3f23303..ea6856072ffcdbd97da623a132a18c360cfa8543 100644 --- a/projects/wobble_bobble/src/main.cpp +++ b/projects/wobble_bobble/src/main.cpp @@ -35,7 +35,7 @@ void distributeParticles(Particle *particles, size_t count, const glm::vec3& cen particles[i].position = center + offset; particles[i].size = size; - particles[i].velocity = glm::vec3(0.1f); + particles[i].velocity = glm::vec3(0.0f); volume += size; } @@ -154,7 +154,12 @@ int main(int argc, const char **argv) { grid.fill(grid_vec.data()); // FIXME: gets limited by staging buffer size... */ - grid.switchLayout(vk::ImageLayout::eGeneral); + vkcv::SamplerHandle gridSampler = core.createSampler( + vkcv::SamplerFilterType::LINEAR, + vkcv::SamplerFilterType::LINEAR, + vkcv::SamplerMipmapMode::NEAREST, + vkcv::SamplerAddressMode::REPEAT + ); vkcv::shader::GLSLCompiler compiler; @@ -207,6 +212,14 @@ int main(int argc, const char **argv) { updateParticleVelocitiesSets ); + { + 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)); + core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes); + } + std::vector<vkcv::DescriptorSetHandle> updateParticlePositionsSets; vkcv::ComputePipelineHandle updateParticlePositionsPipeline = createComputePipeline( core, compiler, @@ -357,6 +370,8 @@ int main(int argc, const char **argv) { const uint32_t dispatchSize [3] = { 1, 1, 1 }; core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", { 0.47f, 0.77f, 0.85f, 1.0f }); + core.prepareImageForStorage(cmdStream, grid.getHandle()); + core.recordComputeDispatchToCmdStream( cmdStream, transformParticlesToGridPipeline, @@ -414,13 +429,19 @@ 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.prepareImageForSampling(cmdStream, grid.getHandle()); + core.recordComputeDispatchToCmdStream( cmdStream, updateParticleVelocitiesPipeline, dispatchSizeUpdateParticles, - {}, + { vkcv::DescriptorSetUsage( + 0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle + ) }, vkcv::PushConstants(0) ); + + core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); core.recordEndDebugLabel(cmdStream); core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE POSITIONS", { 0.78f, 0.89f, 0.94f, 1.0f });