gpt4 book ai didi

c++ - 为什么是 BGRA 而不是 RGBA?

转载 作者:行者123 更新时间:2023-12-02 01:24:59 27 4
gpt4 key购买 nike

所以,我在用 C++ 和 DirectX 11 开发游戏引擎,我注意到人们通常使用 BGRA 而不是 RGBA 作为 SwapChain 格式。人们为什么那样做?为什么是 32 位颜色而不是 256 位颜色?

最佳答案

从历史上看,Direct3D 支持视频卡想要公开的任何格式,并且它同时支持 RGBA 和 BGRA 格式。

对于 Direct3D 10,我们积极努力简化开发人员的支持矩阵,其中一个领域是尝试对仅 RGBA 格式进行标准化。因此,Direct3D 10/DXGI 1.0 仅支持 RGBA 格式。

对于 Direct3D 11,DXGI 1.1 中再次添加了较旧的 BGRA 格式,因为许多 Direct3D 9 时代的驱动程序仍然首选它们来支持 10level9 Direct3D 硬件功能级别。还添加了 16bpp 格式(BGRA)以支持 DXGI 1.2 中的“移动级”GPU。

B5G6R5 and B5G5R5A1 were defined in DXGI 1.1 but weren't supported by any driver until DXGI 1.2.

因此,现代 DXGI 格式列表大部分只有 RGBA,但也有 BGRA 格式:

DXGI_FORMAT_B8G8R8A8_UNORM
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
DXGI_FORMAT_B8G8R8X8_UNORM
DXGI_FORMAT_B8G8R8X8_UNORM_SRGB


DXGI_FORMAT_B5G6R5_UNORM
DXGI_FORMAT_B5G5R5A1_UNORM
DXGI_FORMAT_B4G4R4A4_UNORM

在交换链格式方面,“显示扫描输出”仅支持以下格式:

// Direct3D hardware feature level 9.1 or later
DXGI_FORMAT_B8G8R8A8_UNORM
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB

// Direct3D hardware feature level 9.3 or later
DXGI_FORMAT_R8G8B8A8_UNORM
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB

// Direct3D hardware feature level 10.0 or later
DXGI_FORMAT_R16G16B16A16_FLOAT
DXGI_FORMAT_R10G10B10A2_UNORM
DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM

DXGI_FORMAT_B8G8R8A8_UNORM 因此是 ALL 交换链的 Direct3D 硬件功能级别支持的唯一格式,这就是为什么许多示例和引擎默认使用它的原因。也就是说,除非您尝试在 ARM 设备上支持原始 Windows RT,否则现代游戏和示例都将使用至少 10.0 或更高的 Direct3D 硬件功能级别,因此您几乎可以使用任何有效格式上面列出了交换链。

For Direct3D 11, you should also use D3D11_CREATE_DEVICE_BGRA_SUPPORT as a safety check. Really old first-generation WDDM drivers didn't actually have support for BGRA, and this checks this edge-case as part of device creation. In practice any driver newer than the Windows Vista RTM era is going to support it. This flag is also essential when doing interop with Direct2D / DirectWrite since it only supports BGRA formats (the original Windows GDI was BGRA only).

另见 this blog post series ,特别是关于这些天如何处理 _SRGB 格式的一些怪癖。

For one more bit of BGRA vs. RGBA DirectX trivia, there is a long-standing bug in how 10bpp BGRA vs. RGBA pixel formats were encoded in DDS files due to a symmetric bug in the legacy D3DX library. See this blog post for details.

关于c++ - 为什么是 BGRA 而不是 RGBA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74924790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com