From cdd6a5fa1833cfebb5ecbf6464748feb83fe2cce Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Fri, 4 Feb 2022 18:43:47 +0100 Subject: [PATCH] Still bad but probably good enough Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- projects/wobble_bobble/CMakeLists.txt | 3 +- .../shaders/transform_particles_to_grid.comp | 25 ++++ .../shaders/update_grid_forces.comp | 62 ---------- .../shaders/update_particle_velocities.comp | 38 ++++--- projects/wobble_bobble/src/Material.hpp | 76 ------------- projects/wobble_bobble/src/main.cpp | 107 ++---------------- 6 files changed, 56 insertions(+), 255 deletions(-) delete mode 100644 projects/wobble_bobble/shaders/update_grid_forces.comp delete mode 100644 projects/wobble_bobble/src/Material.hpp diff --git a/projects/wobble_bobble/CMakeLists.txt b/projects/wobble_bobble/CMakeLists.txt index c5dc9cba..9842b13b 100644 --- a/projects/wobble_bobble/CMakeLists.txt +++ b/projects/wobble_bobble/CMakeLists.txt @@ -10,8 +10,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) # adding source files to the project add_executable(wobble_bobble - src/main.cpp - src/Material.hpp) + src/main.cpp) fix_project(wobble_bobble) diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp index f2c2401c..49df3479 100644 --- a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp +++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp @@ -11,6 +11,14 @@ layout(set=0, binding=0, std430) readonly buffer particleBuffer { layout(set=0, binding=1, rgba32f) restrict writeonly uniform image3D gridImage; +layout( push_constant ) uniform constants { + float lame1; + float lame2; + float t; + float dt; + float speedfactor; +}; + #define SHARED_PARTICLES_BATCH_SIZE 64 shared ParticleMinimal shared_particles [SHARED_PARTICLES_BATCH_SIZE]; @@ -18,6 +26,8 @@ shared ParticleMinimal shared_particles [SHARED_PARTICLES_BATCH_SIZE]; void main() { const vec3 position = (vec3(gl_GlobalInvocationID) + vec3(0.5f)) / imageSize(gridImage); + float dts = dt * speedfactor; + vec4 gridValue = vec4(0.0f); uint offset = 0; @@ -61,12 +71,27 @@ void main() { memoryBarrierShared(); } + gridValue.xyz += vec3(0.0f, -9.81f * dts * gridValue.w, 0.0f); gridValue.xyz /= gridValue.w; if (any(isnan(gridValue.xyz)) || any(isinf(gridValue.xyz))) { gridValue.xyz = vec3(0.0f); } + bvec3 lowerID = lessThanEqual(gl_GlobalInvocationID, ivec3(0)); + bvec3 negativeVelocity = lessThan(gridValue.xyz, vec3(0.0f)); + + bvec3 greaterID = greaterThanEqual(gl_GlobalInvocationID + ivec3(1), imageSize(gridImage)); + bvec3 positiveVelocity = greaterThan(gridValue.xyz, vec3(0.0f)); + + bvec3 collision = bvec3( + (lowerID.x && negativeVelocity.x) || (greaterID.x && positiveVelocity.x), + (lowerID.y && negativeVelocity.y) || (greaterID.y && positiveVelocity.y), + (lowerID.z && negativeVelocity.z) || (greaterID.z && positiveVelocity.z) + ); + + gridValue.xyz = mix(gridValue.xyz, vec3(0.0f), collision); + barrier(); memoryBarrierShared(); diff --git a/projects/wobble_bobble/shaders/update_grid_forces.comp b/projects/wobble_bobble/shaders/update_grid_forces.comp deleted file mode 100644 index 59658132..00000000 --- a/projects/wobble_bobble/shaders/update_grid_forces.comp +++ /dev/null @@ -1,62 +0,0 @@ -#version 450 -#extension GL_GOOGLE_include_directive : enable - -layout(local_size_x = 4, local_size_y = 4, local_size_z = 4) in; - -#include "particle.inc" - -layout(set=0, binding=0, rgba32f) restrict readonly uniform image3D gridImage; -layout(set=0, binding=1, rgba32f) restrict writeonly uniform image3D gridForceImage; -layout(set=0, binding=2, std430) readonly buffer particleBuffer { - Particle particles []; -}; - -layout( push_constant ) uniform constants { - float lame1; - float lame2; - float alpha; - float beta; - float t; - float dt; - float speedfactor; -}; - -#define SHARED_PARTICLES_BATCH_SIZE 64 - -shared Particle shared_particles [SHARED_PARTICLES_BATCH_SIZE]; - -void main() { - - float dts = dt * speedfactor; - - barrier(); - memoryBarrierShared(); - memoryBarrierImage(); - - const vec3 gridResolution = vec3(imageSize(gridImage)); - const vec3 position = (vec3(gl_GlobalInvocationID) + vec3(0.5f)) / gridResolution; - - vec4 gridSample = imageLoad( - gridImage, - ivec3(gl_GlobalInvocationID) - ); - - vec3 velocity = gridSample.xyz; - float mass = gridSample.w; - - barrier(); - memoryBarrierBuffer(); - - if (mass > 0.0f) { - velocity += vec3(0.0f, -9.81f * dts, 0.0f); - } - - barrier(); - memoryBarrierImage(); - - imageStore( - gridForceImage, - ivec3(gl_GlobalInvocationID), - vec4(velocity, mass) - ); -} \ No newline at end of file diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp index 6550c095..c5f53ee0 100644 --- a/projects/wobble_bobble/shaders/update_particle_velocities.comp +++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp @@ -11,14 +11,11 @@ layout(set=0, binding=0, std430) restrict buffer particleBuffer { }; layout(set=0, binding=1) uniform texture3D gridImage; -layout(set=0, binding=2) uniform texture3D gridOldImage; -layout(set=0, binding=3) uniform sampler gridSampler; +layout(set=0, binding=2) uniform sampler gridSampler; layout( push_constant ) uniform constants { float lame1; float lame2; - float alpha; - float beta; float t; float dt; float speedfactor; @@ -35,7 +32,6 @@ void main() { vec3 position = particle.minimal.position; float size = particle.minimal.size; - float volume = sphere_volume(size); float mass = particle.minimal.mass; ivec3 gridResolution = textureSize(sampler3D(gridImage, gridSampler), 0); @@ -56,7 +52,6 @@ void main() { vec3 voxel = position + offset; vec4 gridSample = texture(sampler3D(gridImage, gridSampler), voxel); - vec4 gridOldSample = texture(sampler3D(gridOldImage, gridSampler), voxel); float weight = voxel_particle_weight(voxel, particle.minimal); vec3 velocity = gridSample.xyz * weight; @@ -65,7 +60,6 @@ void main() { affine_B += outerProduct(velocity, offset); velocity_pic += velocity; - velocity_flip += (gridSample.xyz - gridOldSample.xyz) * weight; } } } @@ -83,31 +77,39 @@ void main() { float J = determinant(F); if (J > 0.0f) { + float volume = sphere_volume(size) * J; + mat3 F_T = transpose(F); + mat3 F_T_inv = inverse(F_T); - mat3 delta = lame2 * (F * F_T - mat3(1.0f)) + lame1 * log(J); + mat3 delta = lame2 * (F - F_T_inv) + lame1 * log(J) * F_T_inv; + mat3 stress = (1.0f / J) * delta * F_T; - mls_Q -= beta * dts * volume * delta * D_inv; + mls_Q -= dts * volume * stress * D_inv; } affine_C = affine_B * D_inv; - mls_Q += beta * affine_C * mass; + mls_Q += affine_C * mass; } F = (mat3(1.0f) + dts * affine_C) * F; - vec3 velocity = mix(velocity_pic, velocity_flip, alpha); - - position = position + velocity * dts; + position = position + velocity_pic * dts; for (uint i = 0; i < 3; i++) { if (position[i] - size < 0.0f) { - position[i] = -position[i] + 2.0f * size; - velocity[i] *= -1.0f; + position[i] = size; + + if (velocity_pic[i] < 0.0f) { + velocity_pic[i] *= -1.0f; + } } else if (position[i] + size > 1.0f) { - position[i] = 2.0f * (1.0f - size) - position[i]; - velocity[i] *= -1.0f; + position[i] = 1.0f - size; + + if (velocity_pic[i] > 0.0f) { + velocity_pic[i] *= -1.0f; + } } } @@ -115,7 +117,7 @@ void main() { memoryBarrierBuffer(); particles[gl_GlobalInvocationID.x].minimal.position = position; - particles[gl_GlobalInvocationID.x].minimal.velocity = velocity; + particles[gl_GlobalInvocationID.x].minimal.velocity = velocity_pic; particles[gl_GlobalInvocationID.x].deformation = mat4(F); particles[gl_GlobalInvocationID.x].mls = mat4(mls_Q); } diff --git a/projects/wobble_bobble/src/Material.hpp b/projects/wobble_bobble/src/Material.hpp deleted file mode 100644 index 3da7a413..00000000 --- a/projects/wobble_bobble/src/Material.hpp +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -enum MaterialType { - UNDEFINED = 0, GLASS = 1, WOOD = 2, ICE = 3, RUBBER = 4 -}; - -struct Material { - MaterialType m_type; - - float m_compression = 0.0f; // K - compression modulus, given in GPa (multiple of 10^9) - float m_elasticity = 0.0f; // E - elasticity modulus, given in GPa (multiple of 10^9) - float m_shear = 0.0f; // G - shear modulus, given in GPa (multiple of 10^9) - float m_lame1 = 0.0f; // lambda - float m_lame2 = 0.0f; // mu - float m_poission = 0.0f; // nu - float m_longitudinal = 0.0f; // M - - Material(MaterialType materialType = GLASS) { - float K9_E; - switch (materialType) { - case UNDEFINED: - break; - case GLASS: - m_shear = 26.2f * 1E9; // valid for room temperature, data extracted from here: https://de.wikipedia.org/wiki/Schubmodul - m_elasticity = 65.0f * 1E9; // 40 ... 90, data extracted from here: https://de.wikipedia.org/wiki/Elastizitätsmodul - m_compression = m_shear * m_elasticity / (9.0f * m_shear - 3.0f * m_elasticity); // 35 ... 55 - m_poission = (3.0f * m_compression - m_elasticity) / (6.0f * m_compression); - K9_E = (9.0f * m_compression - m_elasticity); - m_lame1 = (3.0f * m_compression * (3.0f * m_compression - m_elasticity)) / K9_E; - m_lame2 = 3.0f * m_compression * m_elasticity / K9_E; - m_longitudinal = 3.0f * m_compression * (3.0f * m_compression + m_elasticity) / K9_E; - break; - case WOOD: - m_shear = 4.0f * 1E9; // data extracted from here: https://en.wikipedia.org/wiki/Shear_modulus - m_elasticity = 11.0f * 1E9; // data extracted from here: https://de.wikipedia.org/wiki/Holz#Eigenschaften - m_compression = m_shear * m_elasticity / (9.0f * m_shear - 3.0f * m_elasticity); - m_poission = (3.0f * m_compression - m_elasticity) / (6.0f * m_compression); - K9_E = (9.0f * m_compression - m_elasticity); - m_lame1 = (3.0f * m_compression * (3.0f * m_compression - m_elasticity)) / K9_E; - m_lame2 = 3.0f * m_compression * m_elasticity / K9_E; - m_longitudinal = 3.0f * m_compression * (3.0f * m_compression + m_elasticity) / K9_E; - break; - case ICE: - m_elasticity = 10.0f * 1E9; // data extracted from here: https://www.yumpu.com/de/document/read/21025809/elastizitatsmodul-e-schubmodul-g-kompressionsmodul-k- - m_shear = 3.6f * 1E9; // data extracted from here: https://www.yumpu.com/de/document/read/21025809/elastizitatsmodul-e-schubmodul-g-kompressionsmodul-k- - m_compression = m_shear * m_elasticity / (9.0f * m_shear - 3.0f * m_elasticity); - m_poission = (3.0f * m_compression - m_elasticity) / (6.0f * m_compression); - K9_E = (9.0f * m_compression - m_elasticity); - m_lame1 = (3.0f * m_compression * (3.0f * m_compression - m_elasticity)) / K9_E; - m_lame2 = 3.0f * m_compression * m_elasticity / K9_E; - m_longitudinal = 3.0f * m_compression * (3.0f * m_compression + m_elasticity) / K9_E; - break; - case RUBBER: - m_elasticity = 0.05f * 1E9; // data extracted from here: https://www.tf.uni-kiel.de/matwis/amat/mw1_ge/kap_7/illustr/t7_1_2.html - m_shear = 0.0003f * 1E9; // data extracted from here: https://www.chemie-schule.de/KnowHow/Schubmodul - m_compression = m_shear * m_elasticity / (9.0f * m_shear - 3.0f * m_elasticity); - m_poission = (3.0f * m_compression - m_elasticity) / (6.0f * m_compression); - K9_E = (9.0f * m_compression - m_elasticity); - m_lame1 = (3.0f * m_compression * (3.0f * m_compression - m_elasticity)) / K9_E; - m_lame2 = 3.0f * m_compression * m_elasticity / K9_E; - m_longitudinal = 3.0f * m_compression * (3.0f * m_compression + m_elasticity) / K9_E; - } - } - - void recalculate(float elasticityModulus, float compressionModulus) { - m_type = UNDEFINED; - m_elasticity = elasticityModulus * 1E9; - m_compression = compressionModulus * 1E9; - float K9_E = (9.0f * m_compression - m_elasticity); - m_shear = 3.0f * m_compression * m_elasticity / K9_E; - m_poission = (3.0f * m_compression - m_elasticity) / (6.0f * m_compression); - m_lame1 = (3.0f * m_compression * (3.0f * m_compression - m_elasticity)) / K9_E; - m_lame2 = 3.0f * m_compression * m_elasticity / K9_E; - m_longitudinal = 3.0f * m_compression * (3.0f * m_compression + m_elasticity) / K9_E; - } -}; \ No newline at end of file diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp index 2ed39b9e..7d69a2e7 100644 --- a/projects/wobble_bobble/src/main.cpp +++ b/projects/wobble_bobble/src/main.cpp @@ -3,7 +3,6 @@ #include <vkcv/camera/CameraManager.hpp> #include <vkcv/gui/GUI.hpp> #include <vkcv/shader/GLSLCompiler.hpp> -#include "Material.hpp" #include <random> @@ -23,8 +22,6 @@ struct Particle { struct Physics { float lame1; float lame2; - float alpha; - float beta; float t; float dt; float speedfactor; @@ -174,8 +171,6 @@ int main(int argc, const char **argv) { swapchainExtent.height ).getHandle(); - int selectedMaterial = 1; - Material material(static_cast<MaterialType>(selectedMaterial)); glm::vec3 initialVelocity (0.0f, 1.0f, 0.0f); float density = 2500.0f; float radius = 0.1f; @@ -196,15 +191,6 @@ int main(int argc, const char **argv) { true ); - vkcv::Image gridCopy = core.createImage( - grid.getFormat(), - grid.getWidth(), - grid.getHeight(), - grid.getDepth(), - false, - true - ); - std::vector<glm::vec4> grid_vec (grid.getWidth() * grid.getHeight() * grid.getDepth()); for (size_t i = 0; i < grid_vec.size(); i++) { @@ -212,7 +198,6 @@ int main(int argc, const char **argv) { } grid.fill(grid_vec.data()); - gridCopy.fill(grid_vec.data()); vkcv::SamplerHandle gridSampler = core.createSampler( vkcv::SamplerFilterType::LINEAR, @@ -235,7 +220,7 @@ 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, gridCopy.getHandle())); + writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, grid.getHandle())); writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(2, gridSampler)); core.writeDescriptorSet(initParticleWeightsSets[0], writes); } @@ -250,23 +235,8 @@ int main(int argc, const char **argv) { { vkcv::DescriptorWrites writes; writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle())); - writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(1, gridCopy.getHandle())); - core.writeDescriptorSet(transformParticlesToGridSets[0], writes); - } - - std::vector<vkcv::DescriptorSetHandle> updateGridForcesSets; - vkcv::ComputePipelineHandle updateGridForcesPipeline = createComputePipeline( - core, compiler, - "shaders/update_grid_forces.comp", - updateGridForcesSets - ); - - { - vkcv::DescriptorWrites writes; - writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(0, gridCopy.getHandle())); writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(1, grid.getHandle())); - writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(2, particles.getHandle())); - core.writeDescriptorSet(updateGridForcesSets[0], writes); + core.writeDescriptorSet(transformParticlesToGridSets[0], writes); } std::vector<vkcv::DescriptorSetHandle> updateParticleVelocitiesSets; @@ -280,8 +250,7 @@ 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.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(2, gridCopy.getHandle())); - writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(3, gridSampler)); + writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(2, gridSampler)); core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes); } @@ -532,12 +501,9 @@ int main(int argc, const char **argv) { bool renderGrid = true; - float compression_modulus = material.m_compression / 1E9; - float elasticity_modulus = material.m_elasticity / 1E9; + float lame1 = 10.0f; + float lame2 = 20.0f; float speed_factor = 1.0f; - - float alpha = 0.0f; - float beta = 1.0f; auto start = std::chrono::system_clock::now(); auto current = start; @@ -572,10 +538,8 @@ int main(int argc, const char **argv) { current = next; Physics physics; - physics.lame1 = material.m_lame1; - physics.lame2 = material.m_lame2; - physics.alpha = alpha; - physics.beta = beta; + physics.lame1 = lame1; + physics.lame2 = lame2; physics.t = static_cast<float>(0.000001 * static_cast<double>(time.count())); physics.dt = static_cast<float>(0.000001 * static_cast<double>(deltatime.count())); physics.speedfactor = speed_factor; @@ -613,7 +577,7 @@ int main(int argc, const char **argv) { core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", { 0.47f, 0.77f, 0.85f, 1.0f }); core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); - core.prepareImageForStorage(cmdStream, gridCopy.getHandle()); + core.prepareImageForStorage(cmdStream, grid.getHandle()); core.recordComputeDispatchToCmdStream( cmdStream, @@ -622,24 +586,6 @@ int main(int argc, const char **argv) { { vkcv::DescriptorSetUsage( 0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle ) }, - vkcv::PushConstants(0) - ); - - core.recordImageMemoryBarrier(cmdStream, gridCopy.getHandle()); - core.recordEndDebugLabel(cmdStream); - - core.recordBeginDebugLabel(cmdStream, "UPDATE GRID FORCES", { 0.47f, 0.77f, 0.85f, 1.0f }); - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); - core.prepareImageForStorage(cmdStream, grid.getHandle()); - core.prepareImageForStorage(cmdStream, gridCopy.getHandle()); - - core.recordComputeDispatchToCmdStream( - cmdStream, - updateGridForcesPipeline, - dispatchSizeGrid, - { vkcv::DescriptorSetUsage( - 0, core.getDescriptorSet(updateGridForcesSets[0]).vulkanHandle - ) }, physicsPushConstants ); @@ -649,7 +595,6 @@ int main(int argc, const char **argv) { core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE VELOCITIES", { 0.78f, 0.89f, 0.94f, 1.0f }); core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); core.prepareImageForSampling(cmdStream, grid.getHandle()); - core.prepareImageForSampling(cmdStream, gridCopy.getHandle()); core.recordComputeDispatchToCmdStream( cmdStream, @@ -721,20 +666,6 @@ int main(int argc, const char **argv) { gui.beginGUI(); ImGui::Begin("Settings"); - ImGui::BeginGroup(); - const char* types[] = {"undefined", "glass", "wood", "ice", "rubber"}; - if (ImGui::Combo("MaterialType", &selectedMaterial, types, IM_ARRAYSIZE(types))) { - if (static_cast<MaterialType>(selectedMaterial) == MaterialType::UNDEFINED) { - material.m_type = MaterialType::UNDEFINED; - } - else { - material = Material(static_cast<MaterialType>(selectedMaterial)); - compression_modulus = material.m_compression / 1E9; - elasticity_modulus = material.m_elasticity / 1E9; - } - } - ImGui::EndGroup(); - ImGui::SliderFloat("Density", &density, std::numeric_limits<float>::epsilon(), 5000.0f); ImGui::SameLine(0.0f, 10.0f); if (ImGui::SmallButton("Reset##density")) { @@ -748,17 +679,11 @@ int main(int argc, const char **argv) { } ImGui::BeginGroup(); - if (ImGui::SliderFloat("Compression Modulus", &compression_modulus, 0.0f, 500.0f)) { - selectedMaterial = 0; - material.recalculate(elasticity_modulus, compression_modulus); - } + ImGui::SliderFloat("Compression Modulus", &lame1, 0.0f, 100.0f); ImGui::EndGroup(); ImGui::BeginGroup(); - if (ImGui::SliderFloat("Elasticity Modulus", &elasticity_modulus, 0.0f, 1000.0f)) { - selectedMaterial = 0; - material.recalculate(elasticity_modulus, compression_modulus); - } + ImGui::SliderFloat("Elasticity Modulus", &lame2, 0.0f, 100.0f); ImGui::EndGroup(); ImGui::Spacing(); @@ -768,18 +693,6 @@ int main(int argc, const char **argv) { ImGui::Spacing(); ImGui::Checkbox("Render Grid", &renderGrid); - ImGui::SliderFloat("Alpha (PIC -> FLIP)", &alpha, 0.0f, 1.0f); - ImGui::SameLine(0.0f, 10.0f); - if (ImGui::SmallButton("Reset##alpha")) { - alpha =1.0f; - } - - ImGui::SliderFloat("Beta (Alpha -> APIC)", &beta, 0.0f, 1.0f); - ImGui::SameLine(0.0f, 10.0f); - if (ImGui::SmallButton("Reset##beta")) { - beta = 0.0f; - } - ImGui::DragFloat3("Initial Velocity", reinterpret_cast<float*>(&initialVelocity), 0.001f); ImGui::SameLine(0.0f, 10.0f); if (ImGui::Button("Reset##particle_velocity")) { -- GitLab