簡體   English   中英

為什么 vulkan 交換鏈更喜歡非 SRGB 格式?

[英]Why prefer Non-SRGB format for vulkan swapchain?

在 Vulkan 立方體示例中,選擇表面格式的方法是:

vk::SurfaceFormatKHR Demo::pick_surface_format(const std::vector<vk::SurfaceFormatKHR> &surface_formats) {
// Prefer non-SRGB formats...
for (const auto &surface_format : surface_formats) {
    const vk::Format format = surface_format.format;

    if (format == vk::Format::eR8G8B8A8Unorm || format == vk::Format::eB8G8R8A8Unorm ||
        format == vk::Format::eA2B10G10R10UnormPack32 || format == vk::Format::eA2R10G10B10UnormPack32 ||
        format == vk::Format::eR16G16B16A16Sfloat) {
        return surface_format;
    }
}

printf("Can't find our preferred formats... Falling back to first exposed format. Rendering may be incorrect.\n");

assert(surface_formats.size() >= 1);
return surface_formats[0];

}

為什么我們更喜歡非 SRGB 格式,不是大多數屏幕都期待 SRGB 格式嗎?

您的問題的答案是:您通常喜歡交換鏈圖像的非 sRGB 格式。 您的懷疑是完全有道理的:有爭議的代碼可以說沒有顯示最佳實踐方法。 考慮圖 1 ,它顯示了捕獲圖像、以低動態范圍 (LDR) 格式存儲圖像並通過計算機顯示器顯示圖像時涉及的基本轉換階段。

伽馬校正 圖 1:很明顯,物理輻射在線性空間中(最左邊的階段)。 當我們捕獲圖像時,我們通常希望將其存儲為 LDR 格式以節省一些空間(“LDR 圖像”階段)。 監視器發出的任何輻射 output 都必須再次處於線性空間中,否則我們會扭曲顏色值(最右邊的階段)。 由於大多數(全部?)監視器僅支持 LDR 幀緩沖區格式,因此它們在發出相應的輻射(監視器階段)之前對幀緩沖區顏色值應用伽瑪校正。

所以,是的,正確的方法是將 sRGB 格式發送到您的顯示器。

事實上,查看gpuinfo.org並按COLOR_ATTACHMENT支持對列表進行排序,可以觀察到 sRGB 格式是最常受支持的格式。 以下是支持的前四種格式:

  • B8G8R8A8_SRGB :99.88%
  • A8B8G8R8_SRGB_PACK32 :99.72%
  • R8G8B8A8_SRGB :99.48%
  • B8G8R8A8_UNORM :99.44%

所以,我會說,默認為 sRGB 格式!

PS:如果您想知道為什么使用 LDR 圖像格式有意義,請查看圖 2以獲得解釋!

在此處輸入圖像描述 圖 2:頂行顯示均勻分布的條 w.r.t。 物理光強度。 這意味着,發射的光子數量在每個相鄰條之間增加相同的數量。 底行顯示均勻間隔的條 w.r.t。 perceived light intensity---物理光強的增加對應於圖1所示的伽馬曲線。 換句話說,我們只需要在較暗的區域添加幾個光子,就能讓感知到的光強度發生巨大變化。 對於較亮的區域,我們必須添加大量光子以獲得相同的感知光強度相對差異。 因此,存儲圖像是有意義的,以便為較暗的 colors 分配相對更多的位,為較亮的 colors 分配較少的位,以便最佳地使用可用位 w.r.t。 人類視覺系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM