From e636b8eae5bba7391b67fdd3ae36f49c8d6f26a4 Mon Sep 17 00:00:00 2001 From: GeorgH93 Date: Sun, 23 May 2021 20:47:23 +0200 Subject: [PATCH] Add option to enable alpha blending --- openVulkanoCpp/Scene/Shader.hpp | 1 + openVulkanoCpp/Vulkan/Pipeline.hpp | 4 ++-- openVulkanoCpp/Vulkan/Renderer.cpp | 3 ++- openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp | 10 ++++++++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/openVulkanoCpp/Scene/Shader.hpp b/openVulkanoCpp/Scene/Shader.hpp index d6e4056..66cdd1d 100644 --- a/openVulkanoCpp/Scene/Shader.hpp +++ b/openVulkanoCpp/Scene/Shader.hpp @@ -132,6 +132,7 @@ namespace openVulkanoCpp::Scene Topology topology = Topology::TRIANGLE_LIST; CullMode cullMode = CullMode::BACK; ICloseable* renderShader = nullptr; + bool alphaBlend = false; // TODO allow fine control over blending Shader() = default; ~Shader() override { if (renderShader) Shader::Close(); } diff --git a/openVulkanoCpp/Vulkan/Pipeline.hpp b/openVulkanoCpp/Vulkan/Pipeline.hpp index 365ee7c..ea64a03 100644 --- a/openVulkanoCpp/Vulkan/Pipeline.hpp +++ b/openVulkanoCpp/Vulkan/Pipeline.hpp @@ -34,8 +34,8 @@ namespace openVulkanoCpp::Vulkan private: void CreatePipelineLayout() { - vk::PushConstantRange camPushConstantDesc = { vk::ShaderStageFlagBits::eVertex, 0, 3 * sizeof(Math::Matrix4f) + sizeof(Math::Vector4f) }; - vk::PushConstantRange camPushConstantDescFrag = { vk::ShaderStageFlagBits::eFragment, 0, 3 * sizeof(Math::Matrix4f) + sizeof(Math::Vector4f) }; + vk::PushConstantRange camPushConstantDesc = { vk::ShaderStageFlagBits::eVertex, 0, 3 * sizeof(Math::Matrix4f) + sizeof(Math::Vector4f) + 4 * sizeof(float) }; + vk::PushConstantRange camPushConstantDescFrag = { vk::ShaderStageFlagBits::eFragment, camPushConstantDesc.size, camPushConstantDesc.size }; std::array camPushConstantDescs = { camPushConstantDesc, camPushConstantDescFrag }; vk::DescriptorSetLayoutBinding nodeLayoutBinding = { 0, vk::DescriptorType::eUniformBufferDynamic, 1, vk::ShaderStageFlagBits::eVertex }; std::array layoutBindings = { nodeLayoutBinding }; diff --git a/openVulkanoCpp/Vulkan/Renderer.cpp b/openVulkanoCpp/Vulkan/Renderer.cpp index d0ebde8..2ee50ef 100644 --- a/openVulkanoCpp/Vulkan/Renderer.cpp +++ b/openVulkanoCpp/Vulkan/Renderer.cpp @@ -146,8 +146,9 @@ namespace openVulkanoCpp::Vulkan cmdHelper->Reset(); vk::CommandBufferInheritanceInfo inheritance = { context.swapChainRenderPass.renderPass, 0, context.swapChainRenderPass.GetFrameBuffer()->GetCurrentFrameBuffer() }; cmdHelper->cmdBuffer.begin(vk::CommandBufferBeginInfo{ vk::CommandBufferUsageFlagBits::eOneTimeSubmit | vk::CommandBufferUsageFlagBits::eRenderPassContinue, &inheritance }); + cmdHelper->cmdBuffer.pushConstants(context.pipeline.pipelineLayout, vk::ShaderStageFlagBits::eVertex, 0, 3 * sizeof(Math::Matrix4f) + sizeof(Math::Vector4f) + 4 * sizeof(float), &scene->GetCamera()->GetViewProjectionMatrix()); + shader->Record(cmdHelper->cmdBuffer, currentImageId); - cmdHelper->cmdBuffer.pushConstants(context.pipeline.pipelineLayout, vk::ShaderStageFlagBits::eVertex, 0, 3 * sizeof(Math::Matrix4f) + sizeof(Math::Vector4f), &scene->GetCamera()->GetViewProjectionMatrix()); Scene::Drawable** drawablePointer; while((drawablePointer = jobQueue->Pop()) != nullptr) { diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp index cb00abd..fd7e24d 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp @@ -73,6 +73,16 @@ namespace openVulkanoCpp::Vulkan depth.maxDepthBounds = 1; vk::PipelineColorBlendAttachmentState colorBlendAttachment = {}; colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eA | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eR; + if (shader->alphaBlend) + { + colorBlendAttachment.blendEnable = true; + colorBlendAttachment.srcColorBlendFactor = vk::BlendFactor::eSrcAlpha; + colorBlendAttachment.dstColorBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha; + colorBlendAttachment.colorBlendOp = vk::BlendOp::eAdd; + colorBlendAttachment.srcAlphaBlendFactor = vk::BlendFactor::eOne; + colorBlendAttachment.dstAlphaBlendFactor = vk::BlendFactor::eZero; + colorBlendAttachment.alphaBlendOp = vk::BlendOp::eAdd; + } vk::PipelineColorBlendStateCreateInfo colorInfo = {}; colorInfo.attachmentCount = 1; colorInfo.pAttachments = &colorBlendAttachment;