【发布时间】:2021-06-22 00:32:30
【问题描述】:
我在主机上有一个“预乘”B8G8R8A8 格式的图像,这意味着每个 R8、G8 和 B8 组件都需要除以 A8(并乘以 255)。参见例如QImage::Format_ARGB32_Premultiplied:https://doc.qt.io/qt-5/qimage.html
我想以通常的VK_FORMAT_R8G8B8A8_UNORM 格式将图像传输并翻译到设备VkImage。
通常我会通过创建主机 VkBuffer 然后将图像传输到带有 vkCmdCopyBufferToImage 的 VkImage 来做到这一点,但我需要调整组件并将该划分应用为该过程的一部分。
我怎样才能做到这一点,以便使用 GPU 快速进行翻译?
【问题讨论】:
-
如果某些图像具有预乘 alpha,您是否应该那样使用数据?也就是说,您确定需要取消预乘吗?
-
@NicolBolas:不错的想法。我想我可以,但是当与其他未预乘的图像混合时,它会与架构混淆。我需要跟踪哪些是和不是,然后编写两个版本的采样器代码。我想我认为将所有图像尽早标准化为相同格式会更容易。
-
"当与其他未预乘的图像混合时,它会与架构混淆" 是吗?预乘 alpha 的全部意义在于您可以像通常对颜色一样使用它,并且数学只是通过正确的混合来解决。您希望用于混合的具有透明度的彩色图像应该被预乘。如果它们没有透明度......就不用担心预乘。
-
@NicolBolas:听起来您建议对所有图像使用预乘格式。通常当一个库(比如 libpng)加载一个 RGBA PNG 图像时,它不会是预乘格式。在加载/传输过程中,您需要在某个地方除以 Alpha 通道。 OTOH,我假设
VkPipelineColorBlendAttachmentState可以通过适当调整各种VK_BLEND_FACTOR_*设置来适应预乘格式。 -
没有“预乘格式”之类的东西。预乘是关于数据的含义,关于它的内容代表什么。它不是任何“格式”的一部分;如果以这种方式生成PNG,则可以对其进行预乘。预乘是您对数据值执行的操作。是的,它会影响混合,但这只是因为它是注定的。如果您有一个反照率图像,其中有您希望在绘图时使用混合的孔,则应该对其进行预乘。如果图像中没有孔,那么“预乘”甚至不是您可以问的问题。
标签: vulkan