微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Vulkan/GPU 转换图像格式?

如何解决使用 Vulkan/GPU 转换图像格式?

我在主机上有一个“预乘”B8G8R8A8 格式的图像,这意味着每个 R8、G8 和 B8 组件都需要除以 A8(并乘以 255)。参见示例 QImage::Format_ARGB32_Premultipliedhttps://doc.qt.io/qt-5/qimage.html

我想以通常的 VkImage 格式将图像传输并翻译到设备 VK_FORMAT_R8G8B8A8_UnorM

通常我会通过创建一个主机 VkBuffer 然后使用 VkImage 将图像传输到 vkCmdcopyBufferToImage 来做到这一点,但我需要混合组件并将该划分应用为该过程的一部分。

如何才能使用 GPU 快速进行翻译?

解决方法

如果没有 VK_FORMAT 预乘,并且您希望在 GPU 上完成过渡,那么我认为计算着色器是可行的方法。屏幕四边形渲染也是可能的,但比计算着色器更难。

但是,如果您希望所有内容都采用一种格式,那么一开始不应该如此,而不是在应用实际运行时这样做吗?

,

solve a problem 进行预乘 alpha。如果您取消预乘(尽可能地,因为 alpha 为 0 会导致原始颜色信息的丢失,即使是很小的 alpha 值也可能使重建颜色变得不可能),您将重新引入问题.

当艺术家使用预乘法时,这可能不是他们想要的。

因此,就透明度而言,您的代码在此问题上应该是二进制的。您的代码应该采用后乘法 alpha(在这种情况下您会遇到问题),或者应该采用预乘法 alpha(在这种情况下您不会遇到问题)。如果您假设是后乘法,而有人将预乘法推到您身上,那就是艺术管道故障,应该在那里解决。

垃圾进,垃圾出。

许多图像格式在格式级别上无法识别“预乘”的概念。也就是说,它们没有预乘的格式标识符或设置或其他东西。图像被无形地“预乘”。

有些格式确实有这样的标志; KTX可以。但是某些格式本质上假设它。例如,使用 1 位 alpha 的 BC1 压缩始终生成颜色为 0 且 alpha 为零的颜色。因此,在线性过滤中,您将始终有效地获得预乘。而且因为它是一种压缩格式

如果您对撤销预乘一无所知,那么您可以使用具有图像加载/存储功能的计算着色器来执行此操作。但最好在工具级别而不是在运行时进行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。