为什么使用 BGRA 而不是 RGBA?

Pre*_*ado 5 c++ directx colors directx-11

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

Chu*_*urn 6

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

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

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

B5G6R5 和 B5G5R5A1 在 DXGI 1.1 中定义,但在 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
Run Code Online (Sandbox Code Playgroud)

就交换链格式而言,“显示扫描输出”仅支持以下格式:

// 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
Run Code Online (Sandbox Code Playgroud)

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

对于 Direct3D 11,您还应该将其用作D3D11_CREATE_DEVICE_BGRA_SUPPORT安全检查。非常旧的第一代 WDDM 驱动程序实际上并不支持 BGRA,这会在设备创建过程中检查这种边缘情况。实际上,任何比 Windows Vista RTM 时代更新的驱动程序都将支持它。当与 Direct2D / DirectWrite 进行互操作时,此标志也很重要,因为它仅支持 BGRA 格式(原始 Windows GDI 仅支持 BGRA)。

另请参阅此博客文章系列,特别是有关_SRGB当今如何处理格式的一些怪癖。

DDS对于 BGRA 与 RGBA DirectX 的更多细节,由于旧版 D3DX 库中的对称错误,10bpp BGRA 与 RGBA 像素格式在文件中编码的方式存在长期存在的错误。有关详细信息,请参阅此博客文章