Skip to content
Snippets Groups Projects
Commit b1cacf8f authored by Sebastian Gaida's avatar Sebastian Gaida
Browse files

[#111] add second compute pipeline and did some flipflop

parent 36182a67
No related branches found
No related tags found
1 merge request!95Resolve "Wassersimulation mit Interaktion"
Pipeline #27098 passed
......@@ -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) {
......
#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;
}
#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;
}
#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
......@@ -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;
}
#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;
// }
}
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment