什么是 vulkan 颜色 space?

What is vulkan color space?

在创建 vulkan 交换链期间,我一直停留在 VkSwapchainCreateInfoKHR 中的 imageColorSpace 和 imageFormat 参数上。我知道 imageFormat 是实际像素的编码和存储在内存中的方式,如果它的颜色不是线性的,那么 vulkan 在着色器中的采样和写入操作期间将其转换为这种颜色。我的硬件仅支持 VK_COLOR_SPACE_SRGB_NONLINEAR_KHR,我想这意味着交换链图像中的颜色应该以非线性方式存储,但 VK_FORMAT_B8G8R8A8_SRGB 导致伽玛 0.44 校正颜色,而 VK_FORMAT_B8G8R8A8_UNORM 工作正常。 imageFormat 与 imageColorSpace 的关系以及 imageColorSpace 指定了什么?

Vulkan 与颜色space 无关。尽管在比特被转换为光子之前的某个时刻,颜色 space 必须是已知的。这就是为什么在创建交换链时需要它。

imageFormat 指定图像格式(与 vkCreateImage() 中的相同)。 imageColorSpace 是 swapchain\display 在显示图像时解释值的方式。

因此,如果您有 UNORM,这意味着未指定颜色 space,它们是很好的原始位。或者更确切地说,这意味着您负责颜色 space(如果图像甚至存储颜色,而不是完全存储其他内容)。如果您将 VK_COLOR_SPACE_SRGB_NONLINEAR_KHR*_UNORM 一起使用,则意味着交换链占用了您的位,并且它会假设它在出现时已经是 SRGB。如果它是 *_SRGB,那么交换链本身没有什么不同,但是所创建的 VkImages 是 *_SRGB 格式,这意味着当 you 使用它们然后为您线性化颜色(与创建非交换链时发生的情况相同 VkImage)。