From b032f8f779ff216fc381d928bd769c69e19395b7 Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Tue, 1 Feb 2022 21:55:21 +0100 Subject: [PATCH] Fix some issues with shared memory in shaders Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- .../shaders/transform_particles_to_grid.comp | 2 ++ .../shaders/update_grid_forces.comp | 18 ++++++++++-------- projects/wobble_bobble/src/main.cpp | 8 ++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp index ab5c30b2..581bd667 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 3e0259cc..6d9434c4 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 02096dba..23d3c90c 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; -- GitLab