From b1cacf8f9ec97bdb37bd8f329dd5c52b21fe8a5a Mon Sep 17 00:00:00 2001 From: Sebastian Gaida <sebastian-gaida@gmx.de> Date: Tue, 7 Sep 2021 16:58:42 +0200 Subject: [PATCH] [#111] add second compute pipeline and did some flipflop --- projects/particle_simulation/src/main.cpp | 2 +- projects/sph/shaders/shader_gravity.comp | 80 ---------------- projects/sph/shaders/shader_space.comp | 73 --------------- projects/sph/shaders/shader_space.frag | 46 ---------- .../{shader_water.comp => shader_water1.comp} | 22 ++--- projects/sph/shaders/shader_water2.comp | 74 +++++++++++++++ projects/sph/src/main.cpp | 91 ++++++++++--------- 7 files changed, 133 insertions(+), 255 deletions(-) delete mode 100644 projects/sph/shaders/shader_gravity.comp delete mode 100644 projects/sph/shaders/shader_space.comp delete mode 100644 projects/sph/shaders/shader_space.frag rename projects/sph/shaders/{shader_water.comp => shader_water1.comp} (79%) create mode 100644 projects/sph/shaders/shader_water2.comp diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp index b760d876..42efb45c 100644 --- a/projects/particle_simulation/src/main.cpp +++ b/projects/particle_simulation/src/main.cpp @@ -65,7 +65,7 @@ int main(int argc, const char **argv) { shaderPathFragment = "shaders/shader_space.frag"; } else if (strcmp(argv[i], "--water") == 0) { - shaderPathCompute = "shaders/shader_water.comp"; + shaderPathCompute = "shaders/shader_water1.comp"; shaderPathFragment = "shaders/shader_water.frag"; } else if (strcmp(argv[i], "--gravity") == 0) { diff --git a/projects/sph/shaders/shader_gravity.comp b/projects/sph/shaders/shader_gravity.comp deleted file mode 100644 index 77954958..00000000 --- a/projects/sph/shaders/shader_gravity.comp +++ /dev/null @@ -1,80 +0,0 @@ -#version 450 core -#extension GL_ARB_separate_shader_objects : enable - -layout(local_size_x = 256) in; - -struct Particle -{ - vec3 position; - float lifeTime; - vec3 velocity; - float mass; - vec3 reset_velocity; - float _padding; -}; - -layout(std430, binding = 0) coherent buffer buffer_inParticle -{ - Particle inParticle[]; -}; - -layout( push_constant ) uniform constants{ - float deltaTime; - float rand; -}; - -const int n = 4; -vec4 gravityPoint[n] = vec4[n]( - vec4(-0.8, -0.5, 0.0, 3), - vec4(-0.4, 0.5, 0.8, 2), - vec4( 0.8, 0.8, -0.3, 4), - vec4( 0.5, -0.7, -0.5, 1) -); - -const float G = 6.6743015e-11; -const float sim_d_factor = 10e11; -const float sim_g_factor = 10e30; -const float sim_t_factor = 5; -const float c = 299792458; - -void main() { - uint id = gl_GlobalInvocationID.x; - inParticle[id].lifeTime -= deltaTime; - vec3 pos = inParticle[id].position; - vec3 vel = inParticle[id].velocity; - float mass = inParticle[id].mass; - - if(inParticle[id].lifeTime < 0.f) - { - inParticle[id].lifeTime = 5.f * rand; - inParticle[id].mass *= rand; - - pos = vec3(0); - vel *= rand; - } - - for(int i = 0; i < n; i++) - { - vec3 d = (gravityPoint[i].xyz - pos) * sim_d_factor; - float r = length(d); - float g = G * (gravityPoint[i].w * sim_g_factor) / (r * r); - - if (r > 0) { - vec3 dvel = (deltaTime * sim_t_factor) * g * (d / r); - - vel = (vel + dvel) / (1.0 + dot(vel, dvel) / (c*c)); - } - } - - pos += vel * (deltaTime * sim_t_factor); - - vec3 a_pos = abs(pos); - - if ((a_pos.x > 2.0) || (a_pos.y > 2.0) || (a_pos.z > 2.0)) - { - inParticle[id].lifeTime *= 0.9; - } - - inParticle[id].position = pos; - inParticle[id].velocity = vel; -} diff --git a/projects/sph/shaders/shader_space.comp b/projects/sph/shaders/shader_space.comp deleted file mode 100644 index 6e25fff8..00000000 --- a/projects/sph/shaders/shader_space.comp +++ /dev/null @@ -1,73 +0,0 @@ -#version 450 core -#extension GL_ARB_separate_shader_objects : enable - -layout(local_size_x = 256) in; - -struct Particle -{ - vec3 position; - float lifeTime; - vec3 velocity; - float padding_2; - vec3 reset_velocity; - float padding_3; -}; - -layout(std430, binding = 0) coherent buffer buffer_inParticle -{ - Particle inParticle[]; -}; - -layout( push_constant ) uniform constants{ - float deltaTime; - float rand; -}; - -vec3 attraction(vec3 pos, vec3 attractPos) -{ - vec3 delta = attractPos - pos; - const float damp = 0.5; - float dDampedDot = dot(delta, delta) + damp; - float invDist = 1.0f / sqrt(dDampedDot); - float invDistCubed = invDist*invDist*invDist; - return delta * invDistCubed * 0.0035; -} - -vec3 repulsion(vec3 pos, vec3 attractPos) -{ - vec3 delta = attractPos - pos; - float targetDistance = sqrt(dot(delta, delta)); - return delta * (1.0 / (targetDistance * targetDistance * targetDistance)) * -0.000035; -} - - -const int n = 4; -vec3 gravity = vec3(0,-9.8,0); -vec3 gravityPoint[n] = vec3[n](vec3(-0.3, .5, -0.6),vec3(-0.2, 0.6, -0.3),vec3(.4, -0.4, 0.6),vec3(-.4, -0.4, -0.6)); -//vec3 gravityPoint[n] = vec3[n](vec3(-0.5, 0.5, 0)); -void main() { - uint id = gl_GlobalInvocationID.x; - inParticle[id].lifeTime -= deltaTime; - vec3 pos = inParticle[id].position; - vec3 vel = inParticle[id].velocity; - if(inParticle[id].lifeTime < 0.f) - { - inParticle[id].lifeTime = 5.f; - pos = vec3(0); - } - // inParticle[id].position += deltaTime * -normalize(max(2 - distance(inParticle[id].position,respawnPos),0.0) * respawnPos - inParticle[id].position); - - for(int i = 0; i < n; i++) - { - vel += deltaTime * deltaTime * normalize(max(2 - distance(pos,gravityPoint[i]),0.1) * gravityPoint[i] - pos); - } - - if((pos.x <= -2.0) || (pos.x > 2.0) || (pos.y <= -2.0) || (pos.y > 2.0)|| (pos.z <= -2.0) || (pos.z > 2.0)){ - vel = (-vel * 0.1); - } - - pos += normalize(vel) * deltaTime; - inParticle[id].position = pos; - float rand1 = rand; - inParticle[id].velocity = vel; -} diff --git a/projects/sph/shaders/shader_space.frag b/projects/sph/shaders/shader_space.frag deleted file mode 100644 index 7f6d2206..00000000 --- a/projects/sph/shaders/shader_space.frag +++ /dev/null @@ -1,46 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable -#extension GL_GOOGLE_include_directive : enable - -#include "particleShading.inc" - -layout(location = 0) in vec2 passTriangleCoordinates; -layout(location = 1) in vec3 passVelocity; -layout(location = 2) in float passlifeTime; - -layout(location = 0) out vec3 outColor; - -layout(set=0, binding=0) uniform uColor { - vec4 color; -} Color; - -layout(set=0,binding=1) uniform uPosition{ - vec2 position; -} Position; - - -void main() -{ - vec2 mouse = vec2(Position.position.x, Position.position.y); - - vec3 c0 = vec3(1, 1, 0.05); - vec3 c1 = vec3(1, passlifeTime * 0.5, 0.05); - vec3 c2 = vec3(passlifeTime * 0.5,passlifeTime * 0.5,0.05); - vec3 c3 = vec3(1, 0.05, 0.05); - - if(passlifeTime < 1){ - outColor = mix(c0, c1, passlifeTime ); - } - else if(passlifeTime < 2){ - outColor = mix(c1, c2, passlifeTime - 1); - } - else{ - outColor = mix(c2, c3, clamp((passlifeTime - 2) * 0.5, 0, 1)); - } - - // make the triangle look like a circle - outColor *= circleFactor(passTriangleCoordinates); - - // fade out particle shortly before it dies - outColor *= clamp(passlifeTime * 2, 0, 1); -} \ No newline at end of file diff --git a/projects/sph/shaders/shader_water.comp b/projects/sph/shaders/shader_water1.comp similarity index 79% rename from projects/sph/shaders/shader_water.comp rename to projects/sph/shaders/shader_water1.comp index a182b401..80b1e8cc 100644 --- a/projects/sph/shaders/shader_water.comp +++ b/projects/sph/shaders/shader_water1.comp @@ -25,7 +25,7 @@ layout(std430, binding = 1) writeonly buffer buffer_outParticle layout( push_constant ) uniform constants{ float deltaTime; - float rand; + float particleCount; }; vec3 attraction(vec3 pos, vec3 attractPos) @@ -52,6 +52,14 @@ vec3 gravityPoint[n] = vec3[n](vec3(-0.5, 0.5, 0),vec3(0.5, 0.5, 0),vec3(0, -0.5 //vec3 gravityPoint[n] = vec3[n](vec3(-0.5, 0.5, 0)); void main() { uint id = gl_GlobalInvocationID.x; + + if(id >= int(particleCount)) + { + return; + } + + outParticle[id] = inParticle[id]; + outParticle[id].lifeTime = inParticle[id].lifeTime - deltaTime; vec3 pos = inParticle[id].position; vec3 vel = inParticle[id].velocity; @@ -62,28 +70,16 @@ void main() { vel = inParticle[id].reset_velocity; outParticle[id].velocity = inParticle[id].reset_velocity; } - // inParticle[id].position += deltaTime * -normalize(max(2 - distance(inParticle[id].position,respawnPos),0.0) * respawnPos - inParticle[id].position); for(int i = 0; i < n; i++) { vel += deltaTime * deltaTime * deltaTime * normalize(max(2 - distance(pos,gravityPoint[i]),0.1) * gravityPoint[i] - pos); } - //vec3 delta = respawnPos - pos; - //float targetDistane = sqrt(dot(delta,delta)); - //vel += repulsion(pos, respawnPos); - - //if((pos.x <= -1.0) || (pos.x > 1.0) || (pos.y <= -1.0) || (pos.y > 1.0)|| (pos.z <= -1.0) || (pos.z > 1.0)) vel = (-vel * 0.01); - - if((pos.y <= -1.0) || (pos.y > 1.0)){ - vel = reflect(vel, vec3(0,1,0)); - } - pos += normalize(vel) * deltaTime; outParticle[id].position = pos; float weight = 1.0; - float rand1 = rand; outParticle[id].velocity = vel; } diff --git a/projects/sph/shaders/shader_water2.comp b/projects/sph/shaders/shader_water2.comp new file mode 100644 index 00000000..32599a64 --- /dev/null +++ b/projects/sph/shaders/shader_water2.comp @@ -0,0 +1,74 @@ +#version 450 core +#extension GL_ARB_separate_shader_objects : enable + +layout(local_size_x = 256) in; + +struct Particle +{ + vec3 position; + float lifeTime; + vec3 velocity; + float padding_2; + vec3 reset_velocity; + float padding_3; +}; + +layout(std430, binding = 1) readonly buffer buffer_inParticle +{ + Particle inParticle[]; +}; + +layout(std430, binding = 0) writeonly buffer buffer_outParticle +{ + Particle outParticle[]; +}; + +layout( push_constant ) uniform constants{ + float deltaTime; + float particleCount; +}; + +const ivec4 gridSize = ivec4(4); +const ivec4 origin = ivec4(1); +const float energyloss = 0.0; + +void main() { + uint id = gl_GlobalInvocationID.x; + + if(id >= int(particleCount)) + { + return; + } + + outParticle[id] = inParticle[id]; + //collisition X-Axis +// if(inParticle[id].position.x >= gridSize.x - origin.x) +// { +// outParticle[id].position.x = gridSize.x - origin.x - 0.001f; +// outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(-1.f,0.f,0.f))* energyloss; +// }else if(inParticle[id].position.x < origin.x) +// { +// outParticle[id].position.x = origin.x + 0.001f; +// outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(1.f,0.f,0.f)) * energyloss; +// } +// //collisition Y-Axis +// if(inParticle[id].position.y >= gridSize.y - origin.y) +// { +// outParticle[id].position.y = gridSize.y - origin.y - 0.001f; +// outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(0.f,-1.f,0.f)) * energyloss; +// }else if(inParticle[id].position.y < origin.y) +// { +// outParticle[id].position.y = origin.y + 0.001f; +// outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(0.f,1.f,0.f)) * energyloss; +// } +// //collisition Z-Axis +// if(inParticle[id].position.z >= gridSize.z - origin.z) +// { +// outParticle[id].position.z = gridSize.z - origin.z - 0.001f; +// outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(0.f,0.f,-1.f)) * energyloss; +// }else if(inParticle[id].position.z < origin.z) +// { +// outParticle[id].position.z = origin.z + 0.001f; +// outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(0.f,0.f,1.f)) * energyloss; +// } +} diff --git a/projects/sph/src/main.cpp b/projects/sph/src/main.cpp index 5acdd906..9550af8b 100644 --- a/projects/sph/src/main.cpp +++ b/projects/sph/src/main.cpp @@ -11,7 +11,7 @@ #include "BloomAndFlares.hpp" int main(int argc, const char **argv) { - const char *applicationName = "Particlesystem"; + const char *applicationName = "SPH"; vkcv::Window window = vkcv::Window::create( applicationName, @@ -54,48 +54,47 @@ int main(int argc, const char **argv) { std::cout << "Error. Could not create renderpass. Exiting." << std::endl; return EXIT_FAILURE; } - - // use space or use water or gravity - std::string shaderPathCompute = "shaders/shader_water.comp"; - std::string shaderPathFragment = "shaders/shader_water.frag"; - -// for (int i = 1; i < argc; i++) { -// if (strcmp(argv[i], "--space") == 0) { -// shaderPathCompute = "shaders/shader_space.comp"; -// shaderPathFragment = "shaders/shader_space.frag"; -// } else -// if (strcmp(argv[i], "--water") == 0) { -// shaderPathCompute = "shaders/shader_water.comp"; -// shaderPathFragment = "shaders/shader_water.frag"; -// } else -// if (strcmp(argv[i], "--gravity") == 0) { -// shaderPathCompute = "shaders/shader_gravity.comp"; -// shaderPathFragment = "shaders/shader_space.frag"; -// } -// } - - vkcv::shader::GLSLCompiler compiler; - vkcv::ShaderProgram computeShaderProgram{}; - compiler.compile(vkcv::ShaderStage::COMPUTE, shaderPathCompute, [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { - computeShaderProgram.addShader(shaderStage, path); + vkcv::shader::GLSLCompiler compiler; +// comp shader 1 + vkcv::ShaderProgram computeShaderProgram1{}; + compiler.compile(vkcv::ShaderStage::COMPUTE, "shaders/shader_water1.comp", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { + computeShaderProgram1.addShader(shaderStage, path); }); - vkcv::DescriptorSetLayoutHandle computeDescriptorSetLayout = core.createDescriptorSetLayout(computeShaderProgram.getReflectedDescriptors().at(0)); - vkcv::DescriptorSetHandle computeDescriptorSet = core.createDescriptorSet(computeDescriptorSetLayout); + vkcv::DescriptorSetLayoutHandle computeDescriptorSetLayout1 = core.createDescriptorSetLayout(computeShaderProgram1.getReflectedDescriptors().at(0)); + vkcv::DescriptorSetHandle computeDescriptorSet1 = core.createDescriptorSet(computeDescriptorSetLayout1); - const std::vector<vkcv::VertexAttachment> computeVertexAttachments = computeShaderProgram.getVertexAttachments(); + const std::vector<vkcv::VertexAttachment> computeVertexAttachments1 = computeShaderProgram1.getVertexAttachments(); - std::vector<vkcv::VertexBinding> computeBindings; - for (size_t i = 0; i < computeVertexAttachments.size(); i++) { - computeBindings.push_back(vkcv::VertexBinding(i, { computeVertexAttachments[i] })); + std::vector<vkcv::VertexBinding> computeBindings1; + for (size_t i = 0; i < computeVertexAttachments1.size(); i++) { + computeBindings1.push_back(vkcv::VertexBinding(i, { computeVertexAttachments1[i] })); } - const vkcv::VertexLayout computeLayout(computeBindings); + const vkcv::VertexLayout computeLayout1(computeBindings1); + +// comp shader 2 + vkcv::ShaderProgram computeShaderProgram2{}; + compiler.compile(vkcv::ShaderStage::COMPUTE, "shaders/shader_water2.comp", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { + computeShaderProgram2.addShader(shaderStage, path); + }); + + vkcv::DescriptorSetLayoutHandle computeDescriptorSetLayout2 = core.createDescriptorSetLayout(computeShaderProgram2.getReflectedDescriptors().at(0)); + vkcv::DescriptorSetHandle computeDescriptorSet2 = core.createDescriptorSet(computeDescriptorSetLayout2); + + const std::vector<vkcv::VertexAttachment> computeVertexAttachments2 = computeShaderProgram2.getVertexAttachments(); + + std::vector<vkcv::VertexBinding> computeBindings2; + for (size_t i = 0; i < computeVertexAttachments2.size(); i++) { + computeBindings2.push_back(vkcv::VertexBinding(i, { computeVertexAttachments2[i] })); + } + const vkcv::VertexLayout computeLayout2(computeBindings2); +// shader vkcv::ShaderProgram particleShaderProgram{}; compiler.compile(vkcv::ShaderStage::VERTEX, "shaders/shader.vert", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { particleShaderProgram.addShader(shaderStage, path); }); - compiler.compile(vkcv::ShaderStage::FRAGMENT, shaderPathFragment, [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { + compiler.compile(vkcv::ShaderStage::FRAGMENT, "shaders/shader_water.frag", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { particleShaderProgram.addShader(shaderStage, path); }); @@ -137,7 +136,8 @@ int main(int argc, const char **argv) { vkcv::PipelineHandle particlePipeline = core.createGraphicsPipeline(particlePipelineDefinition); - vkcv::PipelineHandle computePipeline = core.createComputePipeline(computeShaderProgram, {core.getDescriptorSetLayout(computeDescriptorSetLayout).vulkanHandle} ); + vkcv::PipelineHandle computePipeline1 = core.createComputePipeline(computeShaderProgram1, {core.getDescriptorSetLayout(computeDescriptorSetLayout1).vulkanHandle} ); + vkcv::PipelineHandle computePipeline2 = core.createComputePipeline(computeShaderProgram2, {core.getDescriptorSetLayout(computeDescriptorSetLayout2).vulkanHandle} ); vkcv::Buffer<glm::vec4> color = core.createBuffer<glm::vec4>( vkcv::BufferType::UNIFORM, @@ -177,9 +177,10 @@ int main(int argc, const char **argv) { vkcv::DescriptorWrites computeWrites; computeWrites.storageBufferWrites = { vkcv::BufferDescriptorWrite(0,particleBuffer1.getHandle()), vkcv::BufferDescriptorWrite(1,particleBuffer2.getHandle())}; - core.writeDescriptorSet(computeDescriptorSet, computeWrites); + core.writeDescriptorSet(computeDescriptorSet1, computeWrites); + core.writeDescriptorSet(computeDescriptorSet2, computeWrites); - if (!particlePipeline || !computePipeline) + if (!particlePipeline || !computePipeline1 || !computePipeline2) { std::cout << "Error. Could not create graphics pipeline. Exiting." << std::endl; return EXIT_FAILURE; @@ -252,8 +253,6 @@ int main(int argc, const char **argv) { tonemappingShader, { core.getDescriptorSetLayout(tonemappingDescriptorLayout).vulkanHandle }); - std::uniform_real_distribution<float> rdm = std::uniform_real_distribution<float>(0.95f, 1.05f); - std::default_random_engine rdmEngine; while (window.isWindowOpen()) { vkcv::Window::pollEvents(); @@ -281,22 +280,30 @@ int main(int argc, const char **argv) { renderingMatrices.projection = cameraManager.getActiveCamera().getProjection(); auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics); - float random = rdm(rdmEngine); - glm::vec2 pushData = glm::vec2(deltatime, random); + glm::vec2 pushData = glm::vec2(deltatime, static_cast<float>(particleSystem.getParticles().size())); vkcv::PushConstants pushConstantsCompute (sizeof(glm::vec2)); pushConstantsCompute.appendDrawcall(pushData); uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil(particleSystem.getParticles().size()/256.f)),1,1}; core.recordComputeDispatchToCmdStream(cmdStream, - computePipeline, + computePipeline1, computeDispatchCount, - {vkcv::DescriptorSetUsage(0,core.getDescriptorSet(computeDescriptorSet).vulkanHandle)}, + {vkcv::DescriptorSetUsage(0,core.getDescriptorSet(computeDescriptorSet1).vulkanHandle)}, pushConstantsCompute); core.recordBufferMemoryBarrier(cmdStream, particleBuffer1.getHandle()); core.recordBufferMemoryBarrier(cmdStream, particleBuffer2.getHandle()); + core.recordComputeDispatchToCmdStream(cmdStream, + computePipeline2, + computeDispatchCount, + {vkcv::DescriptorSetUsage(0,core.getDescriptorSet(computeDescriptorSet2).vulkanHandle)}, + pushConstantsCompute); + + core.recordBufferMemoryBarrier(cmdStream, particleBuffer1.getHandle()); + core.recordBufferMemoryBarrier(cmdStream, particleBuffer2.getHandle()); + vkcv::PushConstants pushConstantsDraw (sizeof(renderingMatrices)); pushConstantsDraw.appendDrawcall(renderingMatrices); -- GitLab