From d529627953ad62261e159eaa9e5c82b59c19b903 Mon Sep 17 00:00:00 2001
From: TheJackiMonster <thejackimonster@gmail.com>
Date: Thu, 21 Jul 2022 20:51:39 +0200
Subject: [PATCH] Fixed blending artifacts finally with proper additive
 rendering

Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
 projects/fire_works/shaders/add.comp      |  6 ------
 projects/fire_works/shaders/particle.frag |  2 +-
 projects/fire_works/shaders/smoke.frag    |  4 +---
 projects/fire_works/src/main.cpp          | 10 ++++++----
 src/vkcv/Core.cpp                         |  6 +++---
 5 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/projects/fire_works/shaders/add.comp b/projects/fire_works/shaders/add.comp
index 1846085e..3187e18d 100644
--- a/projects/fire_works/shaders/add.comp
+++ b/projects/fire_works/shaders/add.comp
@@ -18,12 +18,6 @@ void main() {
     vec4 outSmoke = imageLoad(inSmoke, uv);
     vec4 outTrails = imageLoad(inTrails, uv);
 
-    // 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 - clamp(outParticles.a, 0, 1);
-    outSmoke.a = 1.0f - clamp(outSmoke.a, 0, 1);
-    outTrails.a = 1.0f - clamp(outTrails.a, 0, 1);
-
     // TODO: add noise to the smoke here!
 
     vec4 result = vec4(
diff --git a/projects/fire_works/shaders/particle.frag b/projects/fire_works/shaders/particle.frag
index 97221ef2..173c83ef 100644
--- a/projects/fire_works/shaders/particle.frag
+++ b/projects/fire_works/shaders/particle.frag
@@ -14,7 +14,7 @@ void main()	{
     const float value = length(passPos);
 
     if (value < 0.5f) {
-        outColor = vec4(passColor, max(value * 2.0f, 0.0f)); // Use inverse alpha value
+        outColor = vec4(passColor, 1.0f - max(value * 2.0f, 0.0f));
     } else {
         discard;
     }
diff --git a/projects/fire_works/shaders/smoke.frag b/projects/fire_works/shaders/smoke.frag
index ad4ae33d..7339c6ee 100644
--- a/projects/fire_works/shaders/smoke.frag
+++ b/projects/fire_works/shaders/smoke.frag
@@ -56,9 +56,7 @@ void main()	{
     result.r = clamp(result.r, 0, 1);
     result.g = clamp(result.g, 0, 1);
     result.b = clamp(result.b, 0, 1);
-
-    // Inverse alpha value
-    result.a = 1.0f - clamp(result.a, 0, 1);;
+    result.a = clamp(result.a, 0, 1);;
 
     if (result.a < 1.0f) {
         outColor = result;
diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp
index 435bfc62..3d894904 100644
--- a/projects/fire_works/src/main.cpp
+++ b/projects/fire_works/src/main.cpp
@@ -260,7 +260,6 @@ int main(int argc, const char **argv) {
 	particles.resize(PARTICLE_COUNT);
 	initializeParticles(particles);
 	
-	
 	vkcv::Buffer<particle_t> particleBuffer = core.createBuffer<particle_t>(
 		vkcv::BufferType::STORAGE,
 		particles.size(),
@@ -275,8 +274,7 @@ int main(int argc, const char **argv) {
 		core.createBuffer<particle_t>(vkcv::BufferType::STORAGE, particles.size());
 
 	particleBufferCopy.fill(particles);
-
-
+	
 	{
 		vkcv::DescriptorWrites writes;
 		writes.writeStorageBuffer(0, particleBuffer.getHandle());
@@ -393,7 +391,6 @@ int main(int argc, const char **argv) {
 		core.writeDescriptorSet(generationDescriptorSet, writes);
 	}
 
-
 	std::vector<smoke_t> smokes;
 	smokes.reserve(SMOKE_COUNT);
 	
@@ -548,6 +545,8 @@ int main(int argc, const char **argv) {
 		true
 	};
 	
+	smokePipelineDefinition.m_blendMode = vkcv::BlendMode::Additive;
+	
 	vkcv::GraphicsPipelineHandle smokePipeline = core.createGraphicsPipeline(smokePipelineDefinition);
 	
 	const std::vector<vkcv::VertexAttachment> vaTrail = trailShaderProgram.getVertexAttachments();
@@ -570,6 +569,7 @@ int main(int argc, const char **argv) {
 	};
 	
 	trailPipelineDefinition.m_PrimitiveTopology = vkcv::PrimitiveTopology::PointList;
+	trailPipelineDefinition.m_blendMode = vkcv::BlendMode::Additive;
 	
 	vkcv::GraphicsPipelineHandle trailPipeline = core.createGraphicsPipeline(trailPipelineDefinition);
 	
@@ -639,6 +639,8 @@ int main(int argc, const char **argv) {
 		true
 	};
 	
+	particlePipelineDefinition.m_blendMode = vkcv::BlendMode::Additive;
+	
 	vkcv::GraphicsPipelineHandle particlePipeline = core.createGraphicsPipeline(particlePipelineDefinition);
 	
 	std::vector<vkcv::DrawcallInfo> drawcallsParticles;
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index 06942b87..22cc66e7 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -249,9 +249,9 @@ namespace vkcv
 
 				clearValues.emplace_back(std::array<float, 4>{
 					clear,
-						clear,
-						clear,
-						1.f
+					clear,
+					clear,
+					0.f
 				});
 			}
 		}
-- 
GitLab