From a22977e864aab76bc056eb550a42ee5c2020ab61 Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Sat, 26 Jun 2021 19:59:39 +0200
Subject: [PATCH] [#69] Smooth particle color transitions to avoid pop

---
 .../shaders/bloom/composite.comp              |  2 +-
 .../shaders/shader_space.frag                 | 23 +++++++++++++------
 .../shaders/shader_water.frag                 | 23 +++++++++++++------
 projects/particle_simulation/src/main.cpp     |  2 +-
 4 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/projects/particle_simulation/shaders/bloom/composite.comp b/projects/particle_simulation/shaders/bloom/composite.comp
index 66d3cd4b..87b5ddb9 100644
--- a/projects/particle_simulation/shaders/bloom/composite.comp
+++ b/projects/particle_simulation/shaders/bloom/composite.comp
@@ -26,7 +26,7 @@ void main()
     vec3 main_color   = imageLoad(colorBuffer, pixel_coord).rgb;
 
     // composite blur and lens features
-    float bloom_weight = 0.1f;
+    float bloom_weight = 0.01f;
     float lens_weight  = 0.f;
     float main_weight = 1 - (bloom_weight + lens_weight);
 
diff --git a/projects/particle_simulation/shaders/shader_space.frag b/projects/particle_simulation/shaders/shader_space.frag
index a1da5403..6e2974a1 100644
--- a/projects/particle_simulation/shaders/shader_space.frag
+++ b/projects/particle_simulation/shaders/shader_space.frag
@@ -8,7 +8,7 @@ layout(location = 0) in vec2 passTriangleCoordinates;
 layout(location = 1) in vec3 passVelocity;
 layout(location = 2) in float passlifeTime;
 
-layout(location = 0) out vec4 outColor;
+layout(location = 0) out vec3 outColor;
 
 layout(set=0, binding=0) uniform uColor {
 	vec4 color;
@@ -22,13 +22,22 @@ layout(set=0,binding=1) uniform uPosition{
 void main()
 {
 	vec2 mouse = vec2(Position.position.x, Position.position.y);
-		outColor = float(passlifeTime < 1) * vec4(1,1,0,0) +
-				   float(passlifeTime < 2 && passlifeTime > 1) * vec4(1,passlifeTime * 0.5,0,0) +
-				   float(passlifeTime >= 2 && passlifeTime < 2.5f) * vec4(passlifeTime * 0.5,passlifeTime * 0.5,0,0) +
-				   float(passlifeTime >= 2.5f) * vec4(1,0,0,0);
+    
+    vec3 c0 = vec3(1,1,0);
+    vec3 c1 = vec3(1, passlifeTime * 0.5, 0);
+    vec3 c2 = vec3(passlifeTime * 0.5,passlifeTime * 0.5,0);
+    vec3 c3 = vec3(1, 0, 0);
+    
+    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);
-   // full color is achieved by additively blending many particles
-   outColor *= 0.5; 
 }
\ No newline at end of file
diff --git a/projects/particle_simulation/shaders/shader_water.frag b/projects/particle_simulation/shaders/shader_water.frag
index b0b4cc70..4a62ad34 100644
--- a/projects/particle_simulation/shaders/shader_water.frag
+++ b/projects/particle_simulation/shaders/shader_water.frag
@@ -8,7 +8,7 @@ layout(location = 0) in vec2 passTriangleCoordinates;
 layout(location = 1) in vec3 passVelocity;
 layout(location = 2) in float passlifeTime;
 
-layout(location = 0) out vec4 outColor;
+layout(location = 0) out vec3 outColor;
 
 layout(set=0, binding=0) uniform uColor {
 	vec4 color;
@@ -22,13 +22,22 @@ void main()
 {
 	float normlt = 1-normalize(passlifeTime);
 	vec2 mouse = vec2(Position.position.x, Position.position.y);
-	outColor =float(passlifeTime < 1) * vec4(0.2,0.5,1,0) +
-	float(passlifeTime < 2 && passlifeTime > 1) * vec4(0.3, 0.7,1,0) +
-	float(passlifeTime >= 2 && passlifeTime < 4.f) * vec4(0.5,0.9,1,0) +
-	float(passlifeTime >= 4.f) * vec4(0.9,1,1,0);
+    
+    vec3 c0 = vec3(0.2,0.5,1);
+    vec3 c1 = vec3(0.3, 0.7,1);
+    vec3 c2 = vec3(0.5,0.9,1);
+    vec3 c3 = vec3(0.9,1,1);
+    
+    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);
-   // full color is achieved by additively blending many particles
-   outColor *= 0.5; 
 }
diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp
index 8d2a611a..0fbc8bdf 100644
--- a/projects/particle_simulation/src/main.cpp
+++ b/projects/particle_simulation/src/main.cpp
@@ -59,7 +59,7 @@ int main(int argc, const char **argv) {
     }
 
     // use space or use water
-    bool useSpace = true;
+    bool useSpace = false;
 
     vkcv::shader::GLSLCompiler compiler;
     vkcv::ShaderProgram computeShaderProgram{};
-- 
GitLab