diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp index ab5c30b297eddcdf4d5fd086c2e85fe0ce710ad4..581bd667fdf81bcddec292aa10d48ef01ac68c36 100644 --- a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp +++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp @@ -49,6 +49,8 @@ void main() { mass ); } + + memoryBarrierShared(); } if (gridValue.w > 0.0f) { diff --git a/projects/wobble_bobble/shaders/update_grid_forces.comp b/projects/wobble_bobble/shaders/update_grid_forces.comp index 3e0259ccf9a8c9586efbdd1c6c3e0decf96d1ab7..6d9434c45ff0d954a8bd5636d0cb62b12a3ac1d9 100644 --- a/projects/wobble_bobble/shaders/update_grid_forces.comp +++ b/projects/wobble_bobble/shaders/update_grid_forces.comp @@ -40,12 +40,12 @@ void main() { poisson /= (6.0f * K); } + memoryBarrierImage(); + const vec3 gridResolution = vec3(imageSize(gridImage)); const vec3 position = (vec3(gl_GlobalInvocationID) + vec3(0.5f)) / gridResolution; const float h3 = 1.0f / gridResolution.x / gridResolution.y / gridResolution.z; - memoryBarrierImage(); - vec4 gridSample = imageLoad( gridImage, ivec3(gl_GlobalInvocationID) @@ -75,22 +75,22 @@ void main() { memoryBarrierShared(); for (uint i = 0; i < SHARED_PARTICLES_BATCH_SIZE; i++) { - float volume = sphere_volume(shared_particles[gl_LocalInvocationIndex].minimal.size); - mat3 F = mat3(shared_particles[gl_LocalInvocationIndex].deformation); + float volume = sphere_volume(shared_particles[i].minimal.size); + mat3 F = mat3(shared_particles[i].deformation); float J = determinant(F); if ((J > 0.0f) && (volume > 0.0f)) { mat3 F_invT = inverse(transpose(F)); - vec3 v = shared_particles[gl_LocalInvocationIndex].minimal.velocity; - float m = shared_particles[gl_LocalInvocationIndex].minimal.mass; + vec3 v = shared_particles[i].minimal.velocity; + float m = shared_particles[i].minimal.mass; mat3 delta = lame2 * (F - F_invT) + lame1 * log(J) * F_invT; vec3 weight_gradient = voxel_particle_grad_weight( position, - shared_particles[gl_LocalInvocationIndex].minimal + shared_particles[i].minimal ); force -= ( @@ -100,6 +100,8 @@ void main() { ); } } + + memoryBarrierShared(); } if (dt > 0.0f) { @@ -111,7 +113,7 @@ void main() { bvec3 lowerID = lessThanEqual(gl_GlobalInvocationID, ivec3(0)); bvec3 negativeVelocity = lessThan(velocity, vec3(0.0f)); - bvec3 greaterID = greaterThanEqual(gl_GlobalInvocationID + ivec3(1), imageSize(gridImage)); + bvec3 greaterID = greaterThanEqual(gl_GlobalInvocationID + ivec3(1), imageSize(gridForceImage)); bvec3 positiveVelocity = greaterThan(velocity, vec3(0.0f)); bvec3 invert = bvec3( diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp index 02096dbadb06837dae589f3e504ac8fd52925a22..23d3c90c9b9752ff76a6c5b6cb9ff9edfe75e9b6 100644 --- a/projects/wobble_bobble/src/main.cpp +++ b/projects/wobble_bobble/src/main.cpp @@ -165,13 +165,13 @@ int main(int argc, const char **argv) { swapchainExtent.height ).getHandle(); - glm::vec3 initialVelocity (0.0f, 0.0f, 0.0f); + glm::vec3 initialVelocity (0.0f, 1.0f, 0.0f); float density = 2500.0f; float radius = 0.1f; vkcv::Buffer<Particle> particles = core.createBuffer<Particle>( vkcv::BufferType::STORAGE, - 1024 + 64 ); resetParticles(particles, initialVelocity, density, radius); @@ -563,8 +563,8 @@ int main(int argc, const char **argv) { float elasticity_modulus = 45.0f; int elasticity_exponent = 9; - float alpha = 0.5f; - float beta = 0.75f; + float alpha = 1.0f; + float beta = 0.0f; auto start = std::chrono::system_clock::now(); auto current = start;