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]; };