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

xam8gpfp  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(241)

我用C++和DirectX 11开发了一个游戏引擎,我注意到人们通常使用BGRA而不是RGBA作为交换链格式。为什么人们会这样做?为什么是32位颜色而不是256位颜色?
感谢答案

nhaq1z21

nhaq1z211#

从历史上看,Direct 3D支持视频卡想要公开的任何格式,它支持RGBA和BGRA格式。
对于Direct 3D 10,有一个积极的努力来简化开发人员的支持矩阵,其中一个领域是尝试标准化的RGBA唯一格式。Direct 3D 10 / DXGI 1.0只支持RGBA格式的结果。
对于Direct 3D 11,旧的BGRA格式再次添加到DXGI 1.1中,因为许多Direct 3D 9时代的驱动程序仍然喜欢它们来支持10 level 9 Direct 3D硬件功能级别。16 bpp格式(BGRA)也被添加到DXGI 1.2中以支持“移动级”GPU。
B5 G6 R5和B5 G5 R5 A1在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

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

// 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是交换链的 * 所有 * Direct 3D硬件功能级别支持的唯一格式,这就是为什么许多示例和引擎默认使用它的原因。也就是说,除非您尝试在ARM设备上支持原始Windows RT,否则现代游戏和示例都将使用10.0或更高的Direct 3D硬件功能级别。因此您几乎可以使用上面列出的交换链的任何有效格式。
对于Direct 3D 11,你还应该使用D3D11_CREATE_DEVICE_BGRA_SUPPORT作为安全检查。非常旧的第一代WDDM驱动程序实际上并不支持BGRA,这将检查这个边缘情况作为设备创建的一部分。实际上,任何比WindowsVista RTM时代更新的驱动程序都将支持它。这个标志在与Direct 2D/ DirectWrite互操作时也是必不可少的,因为它只支持BGRA格式(最初的Windows GDI仅适用于BGRA)。
另请参见this blog post series,特别是关于当今如何处理_SRGB的一些怪癖。
关于BGRA vs. RGBA DirectX的另一个小问题,由于遗留D3 DX库中的对称错误,在DDS文件中编码10 bpp BGRA vs. RGBA像素格式时存在一个长期存在的错误。

相关问题