Surface格式是B8G8R8A8_UNORM,但是vkCmdClearColorImage需要float?

Surface format is B8G8R8A8_UNORM, but vkCmdClearColorImage takes float?

我使用 vkGetPhysicalDeviceSurfaceFormatsKHR 来获取交换链支持的图像格式,并且(在 Linux+Nvidia 上,使用 SDL)我将 VK_FORMAT_B8G8R8A8_UNORM 作为第一个选项,然后我继续并使用该格式创建交换链:

VkSwapchainCreateInfoKHR swapchain_info = {
    ...
    .imageFormat = format, /* taken from vkGetPhysicalDeviceSurfaceFormatsKHR */
    ...
};

到目前为止,一切都说得通了。用于在屏幕上绘制的图像格式是通常的每通道 8 位 BGRA。

作为我学习过程的一部分,到目前为止,我已经完成了很多设置,但还没有设置图形管道1。所以我正在尝试我可以使用的唯一不需要管道的命令:vkCmdClearColorImage2.

用于定义清晰颜色的VkClearColorValue可以取floatuint32_tint32_t颜色,具体取决于图像的格式。根据提供给交换链的图像格式,我本以为我应该给它 uint32_t 值,但这似乎不正确。我知道,因为屏幕颜色没有改变。我试着给它 floats 并且它起作用了。

我的问题是,为什么在图片格式为VK_FORMAT_B8G8R8A8_UNORM的情况下,在floats中需要指定清晰的颜色?


1 实际上我有,但我想我会先尝试更简单的没有管道的情况。我正在尝试逐步使用 Vulkan(考虑到它的冗长),特别是因为我也在学习 tutorials on it

2 实际上,它在技术上不需要渲染通道,但我想嘿,我在这里没有使用任何管道,所以让我们在没有管道的情况下尝试它并且它有效。


我的渲染循环基本上如下:

My question is, why does the clear color need to be specified in floats when the image format is VK_FORMAT_B8G8R8A8_UNORM?

因为 normalized、缩放或 sRGB 图像格式实际上只是浮点压缩的各种形式。规范化整数是一种在 [0, 1] 或 [-1, 1] 范围内存储浮点值的方法,但使用的数据量甚至比 16 位浮点数少得多。缩放整数是一种在 [0, MAX] 或 [-MIN, MAX] 范围内存储浮点值的方法。 sRGB 只是一种在 [0, 1] 范围内存储线性颜色值的压缩方式,但在经过伽马校正的颜色 space 中,它会将精度放在与线性颜色值所建议的不同的位置。

对于顶点着色器的输入,您会看到相同的情况。 vec4 输入类型可以由规范化格式提供,也可以由浮点格式提供。