【发布时间】:2021-09-17 14:17:47
【问题描述】:
在 Vulkan 程序中,片段着色器通常向每个红/蓝/绿通道输出 0.0 到 1.0 范围内的单精度浮点颜色,然后将这些颜色写入(混合到)交换链图像,然后呈现在屏幕上。浮点值根据交换链图像的格式(在创建交换链时指定)编码为位。
当我将交换链格式从 VK_FORMAT_B8G8R8A8_UNORM 更改为 VK_FORMAT_B8G8R8A8_SRGB 时,我观察到帧的整体亮度大大增加,并且还有一些轻微的颜色偏移。
我对 SRGB 格式的理解是,它很像 UNORM 格式,只是浮点值到 8 位整数的映射有所不同,因此它在某些区域具有更高的颜色分辨率而在其他区域具有更低的颜色分辨率,但是“预编码”RGB 浮点值的实际含义保持不变。
所以我对亮度增加有点惊讶。我对 SRGB 编码的理解是错误的吗?和/或与 UNORM 相比,这种亮度增加是预期的吗?
或者也许我有一个错误并且预计不会增加亮度?
更新:
我观察到,如果我使用 SRGB 交换链图像并且还以 VK_FORMAT_B8G8R8A8_SRGB 格式而不是 VK_FORMAT_B8G8R8A8_UNORM 加载我的图像/纹理,那么额外的亮度就会消失。它看起来就像我使用 VK_FORMAT_B8G8R8A8_UNORM 交换链图像并以 VK_FORMAT_B8G8R8A8_UNORM 格式加载我的图像/纹理一样。
另外,如果我将交换链图像放入 VK_FORMAT_B8G8R8A8_UNORM 格式,然后使用 VK_FORMAT_B8G8R8A8_SRGB 加载图像/纹理,帧看起来特别暗/几乎是黑色。
弄清正在发生的事情会有所帮助。
【问题讨论】:
标签: vulkan