【问题标题】:Converting image format with Vulkan/GPU?使用 Vulkan/GPU 转换图像格式?
【发布时间】:2021-06-22 00:32:30
【问题描述】:

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

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

通常我会通过创建主机 VkBuffer 然后将图像传输到带有 vkCmdCopyBufferToImageVkImage 来做到这一点,但我需要调整组件并将该划分应用为该过程的一部分。

我怎样才能做到这一点,以便使用 GPU 快速进行翻译?

【问题讨论】:

  • 如果某些图像具有预乘 alpha,您是否应该那样使用数据?也就是说,您确定需要取消预乘吗?
  • @NicolBolas:不错的想法。我想我可以,但是当与其他未预乘的图像混合时,它会与架构混淆。我需要跟踪哪些是和不是,然后编写两个版本的采样器代码。我想我认为将所有图像尽早标准化为相同格式会更容易。
  • "当与其他未预乘的图像混合时,它会与架构混淆" 是吗?预乘 alpha 的全部意义在于您可以像通常对颜色一样使用它,并且数学只是通过正确的混合来解决。您希望用于混合的具有透明度的彩色图像应该被预乘。如果它们没有透明度......就不用担心预乘。
  • @NicolBolas:听起来您建议对所有图像使用预乘格式。通常当一个库(比如 libpng)加载一个 RGBA PNG 图像时,它不会是预乘格式。在加载/传输过程中,您需要在某个地方除以 Alpha 通道。 OTOH,我假设 VkPipelineColorBlendAttachmentState 可以通过适当调整各种 VK_BLEND_FACTOR_* 设置来适应预乘格式。
  • 没有“预乘格式”之类的东西。预乘是关于数据的含义,关于它的内容代表什么。它不是任何“格式”的一部分;如果以这种方式生成PNG,则可以对其进行预乘。预乘是您对数据值执行的操作。是的,它会影响混合,但这只是因为它是注定的。如果您有一个反照率图像,其中有您希望在绘图时使用混合的孔,则应该对其进行预乘。如果图像中没有孔,那么“预乘”甚至不是您可以的问题。

标签: vulkan


【解决方案1】:

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

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

【讨论】:

  • 图片是在运行时生成的,所以在app运行之前图片是不存在的。
  • 那么如果你可以更改生成图像的代码。此外,如果您希望它在 GPU 上完成,那么我想它会经常生成,就像每一帧左右一样。在这种情况下,计算着色器。只需为每个像素设置一个线程,图像加载/存储,除以 alpha(它的所有浮点数,无需乘以 255)。
  • 生成图像的代码是一个名为 Blend2D 的库:blend2d.com,重写该库以生成不同的格式会太耗时。事实证明,该库有一个用于此任务的主机端优化 BLPixelConverter 类:blend2d.com/doc/classBLPixelConverter.html 我可能会在使用计算机着色器路线之前尝试一下。我不确定我的所有目标平台都支持计算。
【解决方案2】:

solve a problem 进行预乘 alpha。如果您撤消预乘(在可能的范围内,因为 0 的 alpha 会导致原始颜色信息的丢失,即使 alpha 的小值也可能无法重建颜色),您将重新引入问题。

这可能不是艺术家在使用预乘法时想要的。

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

垃圾进,垃圾出。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2021-02-17
    • 2017-08-31
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多