diff --git a/src/rendering/vulkan/renderer/vk_renderpass.cpp b/src/rendering/vulkan/renderer/vk_renderpass.cpp
index 616668cec..ea4738f63 100644
--- a/src/rendering/vulkan/renderer/vk_renderpass.cpp
+++ b/src/rendering/vulkan/renderer/vk_renderpass.cpp
@@ -261,7 +261,7 @@ void VkRenderPassSetup::CreatePipeline(const VkRenderPassKey &key)
 	VkShaderProgram *program;
 	if (key.SpecialEffect != EFF_NONE)
 	{
-		program = fb->GetShaderManager()->GetEffect(key.SpecialEffect);
+		program = fb->GetShaderManager()->GetEffect(key.SpecialEffect, key.DrawBuffers > 1 ? GBUFFER_PASS : NORMAL_PASS);
 	}
 	else
 	{
diff --git a/src/rendering/vulkan/shaders/vk_shader.cpp b/src/rendering/vulkan/shaders/vk_shader.cpp
index e0c5a2fd2..6114c3191 100644
--- a/src/rendering/vulkan/shaders/vk_shader.cpp
+++ b/src/rendering/vulkan/shaders/vk_shader.cpp
@@ -42,14 +42,14 @@ VkShaderManager::VkShaderManager(VulkanDevice *device) : device(device)
 			prog.frag = LoadFragShader(name, mainfp, usershaders[i].shader, defaultshaders[usershaders[i].shaderType].lightfunc, defines, true, gbufferpass);
 			mMaterialShaders[j].push_back(std::move(prog));
 		}
-	}
 
-	for (int i = 0; i < MAX_EFFECTS; i++)
-	{
-		VkShaderProgram prog;
-		prog.vert = LoadVertShader(effectshaders[i].ShaderName, effectshaders[i].vp, defaultshaders[i].Defines);
-		prog.frag = LoadFragShader(effectshaders[i].ShaderName, effectshaders[i].fp1, effectshaders[i].fp2, effectshaders[i].fp3, effectshaders[i].defines, true, false);
-		mEffectShaders[i] = std::move(prog);
+		for (int i = 0; i < MAX_EFFECTS; i++)
+		{
+			VkShaderProgram prog;
+			prog.vert = LoadVertShader(effectshaders[i].ShaderName, effectshaders[i].vp, effectshaders[i].defines);
+			prog.frag = LoadFragShader(effectshaders[i].ShaderName, effectshaders[i].fp1, effectshaders[i].fp2, effectshaders[i].fp3, effectshaders[i].defines, true, gbufferpass);
+			mEffectShaders[j].push_back(std::move(prog));
+		}
 	}
 }
 
@@ -58,11 +58,11 @@ VkShaderManager::~VkShaderManager()
 	ShFinalize();
 }
 
-VkShaderProgram *VkShaderManager::GetEffect(int effect)
+VkShaderProgram *VkShaderManager::GetEffect(int effect, EPassType passType)
 {
-	if (effect >= 0 && effect < MAX_EFFECTS && mEffectShaders[effect].frag)
+	if (effect >= 0 && effect < MAX_EFFECTS && mEffectShaders[passType][effect].frag)
 	{
-		return &mEffectShaders[effect];
+		return &mEffectShaders[passType][effect];
 	}
 	return nullptr;
 }
diff --git a/src/rendering/vulkan/shaders/vk_shader.h b/src/rendering/vulkan/shaders/vk_shader.h
index 931288fea..37836d83c 100644
--- a/src/rendering/vulkan/shaders/vk_shader.h
+++ b/src/rendering/vulkan/shaders/vk_shader.h
@@ -61,7 +61,7 @@ public:
 	VkShaderManager(VulkanDevice *device);
 	~VkShaderManager();
 
-	VkShaderProgram *GetEffect(int effect);
+	VkShaderProgram *GetEffect(int effect, EPassType passType);
 	VkShaderProgram *Get(unsigned int eff, bool alphateston, EPassType passType);
 
 private:
@@ -76,5 +76,5 @@ private:
 
 	std::vector<VkShaderProgram> mMaterialShaders[MAX_PASS_TYPES];
 	std::vector<VkShaderProgram> mMaterialShadersNAT[MAX_PASS_TYPES];
-	VkShaderProgram mEffectShaders[MAX_EFFECTS];
+	std::vector<VkShaderProgram> mEffectShaders[MAX_PASS_TYPES];
 };