Vulkan:支持精灵的 Alpha 通道

Des*_*ess 2 vulkan

我正在尝试绘制一些精灵,其中考虑了图像的 Alpha 通道。

以下结构在片段着色器中支持纹理 Alpha 通道的正确值集是什么?

vk::PipelineColorBlendAttachmentState colorBlendAttachment; 
colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA;
colorBlendAttachment.blendEnable    = VK_TRUE;
colorBlendAttachment.srcColorBlendFactor = vk::BlendFactor::eOne;
colorBlendAttachment.dstColorBlendFactor = vk::BlendFactor::eZero;
colorBlendAttachment.colorBlendOp        = vk::BlendOp::eAdd;   
colorBlendAttachment.srcAlphaBlendFactor = vk::BlendFactor::eOne;
colorBlendAttachment.dstAlphaBlendFactor = vk::BlendFactor::eZero;  
colorBlendAttachment.alphaBlendOp        = vk::BlendOp::eSubtract;


vk::PipelineColorBlendStateCreateInfo colorBlending;    
colorBlending.logicOpEnable     = VK_FALSE;
colorBlending.logicOp           = vk::LogicOp::eCopy;
colorBlending.attachmentCount   = 1;
colorBlending.pAttachments      = &colorBlendAttachment;
colorBlending.blendConstants[0] = 0.0f;
colorBlending.blendConstants[1] = 0.0f;
colorBlending.blendConstants[2] = 0.0f;
colorBlending.blendConstants[3] = 0.0f;
Run Code Online (Sandbox Code Playgroud)

Des*_*ess 6

根据 Ekzusy 的回答,有两种方法:

在片段着色器中使用“discard”关键字。

// Read data from some texture.
vec4 color = texture(...); 
// This makes the alpha channel (w component) act as a boolean.    
if (color.w < 1) { discard; }
Run Code Online (Sandbox Code Playgroud)

对于我原来的问题,这些值可以:

vk::PipelineColorBlendAttachmentState colorBlendAttachment;
colorBlendAttachment.colorWriteMask = 
  vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG |
  vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA;
colorBlendAttachment.blendEnable = VK_TRUE;
colorBlendAttachment.srcColorBlendFactor = vk::BlendFactor::eSrcAlpha;
colorBlendAttachment.dstColorBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha;
colorBlendAttachment.colorBlendOp = vk::BlendOp::eAdd;
colorBlendAttachment.srcAlphaBlendFactor = vk::BlendFactor::eSrcAlpha;
colorBlendAttachment.dstAlphaBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha;
colorBlendAttachment.alphaBlendOp = vk::BlendOp::eSubtract;
Run Code Online (Sandbox Code Playgroud)