Add option to enable alpha blending
This commit is contained in:
@@ -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(); }
|
||||
|
||||
@@ -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<vk::PushConstantRange, 2> camPushConstantDescs = { camPushConstantDesc, camPushConstantDescFrag };
|
||||
vk::DescriptorSetLayoutBinding nodeLayoutBinding = { 0, vk::DescriptorType::eUniformBufferDynamic, 1, vk::ShaderStageFlagBits::eVertex };
|
||||
std::array<vk::DescriptorSetLayoutBinding, 1> layoutBindings = { nodeLayoutBinding };
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user