diff --git a/projects/fire_works/shaders/add.comp b/projects/fire_works/shaders/add.comp
index eb20cc52eab6eeadcffcded6b2924c172aee58fc..70a15c4e93e07728c081c54d4fe49469277dab8f 100644
--- a/projects/fire_works/shaders/add.comp
+++ b/projects/fire_works/shaders/add.comp
@@ -18,5 +18,21 @@ void main() {
     vec4 outSmoke = imageLoad(inSmoke, uv);
     vec4 outTrails = imageLoad(inTrails, uv);
 
-    imageStore(outImage, uv, outParticles + outSmoke + outTrails);
+    // Reverse alpha values:
+    // -> Because clear value is always vec4(0, 0, 0, 1) which is now vec4(0, 0, 0, 0)!
+    outParticles.a = 1.0f - outParticles.a;
+    outSmoke.a = 1.0f - outSmoke.a;
+    outTrails.a = 1.0f - outTrails.a;
+
+    // TODO: add noise to the smoke here!
+
+    vec4 result = vec4(
+        outParticles.rgb * outParticles.a +
+        outSmoke.rgb * outSmoke.a +
+        outTrails.rgb * outTrails.a,
+
+        outParticles.a + outSmoke.a + outTrails.a
+    );
+
+    imageStore(outImage, uv, result);
 }
\ No newline at end of file
diff --git a/projects/fire_works/shaders/particle.frag b/projects/fire_works/shaders/particle.frag
index 0733da739934384082c0c9c3040ee7d6a24ad122..e1fa6de0a0280c4be1e09cc8e29346b3e11b19cc 100644
--- a/projects/fire_works/shaders/particle.frag
+++ b/projects/fire_works/shaders/particle.frag
@@ -4,7 +4,7 @@ layout(location = 0) in vec2 passPos;
 layout(location = 1) in flat vec3 passColor;
 layout(location = 2) in flat float passLifetime;
 
-layout(location = 0) out vec3 outColor;
+layout(location = 0) out vec4 outColor;
 
 void main()	{
     if (passLifetime <= 0.0f) {
@@ -14,7 +14,7 @@ void main()	{
     const float value = length(passPos);
 
     if (value < 0.5f) {
-        outColor = passColor * max(0.0f, 0.5f - value) * 2.0f;
+        outColor = vec4(passColor, value * 2.0f); // Use inverse alpha value
     } else {
         discard;
     }
diff --git a/projects/fire_works/shaders/smoke.frag b/projects/fire_works/shaders/smoke.frag
index a7e6415d71b1b708fd52be716f68eb2242c26fbd..30fb3667ef1f54d68540fd760c846c8dca6d0aa4 100644
--- a/projects/fire_works/shaders/smoke.frag
+++ b/projects/fire_works/shaders/smoke.frag
@@ -10,7 +10,7 @@ layout(location = 2) in vec3 passColor;
 layout(location = 3) in float passDensity;
 layout(location = 4) in flat int passSmokeIndex;
 
-layout(location = 0) out vec3 outColor;
+layout(location = 0) out vec4 outColor;
 
 layout(set=1, binding=0, std430) readonly buffer randomBuffer {
     float randomData [];
@@ -53,16 +53,12 @@ void main()	{
         );
     }
 
-    result.a += (1.0f + randomData[passSmokeIndex % randomData.length()] * 0.1f) * result.a;
+    // Inverse alpha value
+    result.a = 1.0f - result.a;
 
-    if (result.a <= 0.0f) {
+    if (result.a < 1.0f) {
+        outColor = result;
+    } else {
         discard;
     }
-
-    result.r = clamp(result.r, 0.0f, 1.0f);
-    result.g = clamp(result.g, 0.0f, 1.0f);
-    result.b = clamp(result.b, 0.0f, 1.0f);
-    result.a = clamp(result.a, 0.0f, 1.0f);
-
-    outColor += vec3(result.rgb * result.a);
 }
\ No newline at end of file
diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp
index 2aa5b4c3f72dac8201dfae2e59a5c2ee02421748..acd9411255e0bf33f3aa930a74d5466f8c12ca7b 100644
--- a/projects/fire_works/src/main.cpp
+++ b/projects/fire_works/src/main.cpp
@@ -762,8 +762,6 @@ int main(int argc, const char **argv) {
 		vkcv::PushConstants pushConstantsDraw0 (sizeof(draw_particles_t));
 		pushConstantsDraw0.appendDrawcall(draw_particles);
 		
-		core.recordImageMemoryBarrier(cmdStream, colorBuffers[0]);
-		
 		core.recordBeginDebugLabel(cmdStream, "Draw particles", { 1.0f, 0.0f, 1.0f, 1.0f });
 		core.recordDrawcallsToCmdStream(
 			cmdStream,
@@ -786,8 +784,6 @@ int main(int argc, const char **argv) {
 		vkcv::PushConstants pushConstantsDraw1 (sizeof(glm::mat4) * 2);
 		pushConstantsDraw1.appendDrawcall(smokeMatrices);
 		
-		core.recordImageMemoryBarrier(cmdStream, colorBuffers[1]);
-		
 		core.recordDrawcallsToCmdStream(
 			cmdStream,
 			renderPass,
@@ -802,8 +798,6 @@ int main(int argc, const char **argv) {
 		core.recordBufferMemoryBarrier(cmdStream, trailBuffer.getHandle());
 		core.recordBufferMemoryBarrier(cmdStream, pointBuffer.getHandle());
 		
-		core.recordImageMemoryBarrier(cmdStream, colorBuffers[2]);
-		
 		core.recordBeginDebugLabel(cmdStream, "Draw trails", { 0.75f, 0.5f, 1.0f, 1.0f });
 		core.recordDrawcallsToCmdStream(
 			cmdStream,