Vulkan:精灵Alpha通道支持——管线颜色混合附件状态配置咨询
Vulkan精灵Alpha混合的
PipelineColorBlendAttachmentState正确配置 嘿,针对带Alpha通道的精灵绘制,你已经做对了关键的第一步——开启混合并允许写入所有RGBA通道,接下来只需要把混合因子和操作配置正确就行。下面是完整的正确取值,以及对应的解释:
完整配置代码
vk::PipelineColorBlendAttachmentState colorBlendAttachment; // 允许写入所有颜色通道(包括Alpha) colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; // 开启混合 colorBlendAttachment.blendEnable = VK_TRUE; // 颜色通道混合设置(最常用的源Alpha混合) colorBlendAttachment.srcColorBlendFactor = vk::BlendFactor::eSrcAlpha; colorBlendAttachment.dstColorBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha; colorBlendAttachment.colorBlendOp = vk::BlendOp::eAdd; // Alpha通道混合设置,和颜色通道保持一致即可 colorBlendAttachment.srcAlphaBlendFactor = vk::BlendFactor::eSrcAlpha; colorBlendAttachment.dstAlphaBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha; colorBlendAttachment.alphaBlendOp = vk::BlendOp::eAdd;
为什么这么设置?
这种配置是精灵半透明绘制的标准方案:
eSrcAlpha表示源颜色(你的精灵纹理颜色)会乘以自身的Alpha值,Alpha越低,精灵颜色越淡eOneMinusSrcAlpha表示目标颜色(帧缓冲区里的背景)会乘以1 - 源Alpha,背景会根据精灵的透明度自然透出eAdd表示把处理后的源颜色和目标颜色相加,得到最终的混合结果
特殊情况:预乘Alpha纹理
如果你的精灵纹理是预乘Alpha格式(颜色通道已经提前乘以了Alpha值),那需要把srcColorBlendFactor改成vk::BlendFactor::eOne,其他参数不变,这样混合计算会更准确。
内容的提问来源于stack exchange,提问作者Dess
相关产品推荐
相关产品推荐

