Итак, я разрабатывал игровой движок на C++ и DirectX 11 и заметил, что люди обычно используют BGRA вместо RGBA в качестве формата SwapChain. Почему люди так делают? И почему 32-битный цвет вместо 256-битного?
Спасибо за ответы
Поскольку, насколько мне известно, контроллер дисплея в вашем графическом процессоре довольно часто работает с BGRA вместо RGBA, а предоставление графики в формате контроллера дисплея устраняет необходимость его преобразования.
Я нашел похожее обсуждение про vulkan и BGRA: https://www.reddit.com/r/vulkan/comments/p3iy0o/why_use_bgra_instead_of_rgba/





Исторически сложилось так, что Direct3D поддерживал любые форматы, которые видеокарты хотели использовать, а также форматы RGBA и BGRA.
Для Direct3D 10 предпринимались активные усилия по упрощению матрицы поддержки для разработчиков, и одной из областей была попытка стандартизировать только форматы RGBA. В результате Direct3D 10/DXGI 1.0 поддерживал только форматы RGBA.
Для Direct3D 11 старые форматы BGRA были снова добавлены в DXGI 1.1, потому что многие драйверы эпохи Direct3D 9 по-прежнему предпочитали их для поддержки аппаратных уровней функций Direct3D 10level9. Форматы 16bpp (которые являются BGRA) также были добавлены для поддержки графических процессоров «мобильного класса» в DXGI 1.2.
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
Что касается форматов цепочки обмена, для «сканирования дисплея» поддерживаются только следующие:
// 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 является единственным форматом, который поддерживается ВСЕМИ уровнями аппаратных функций Direct3D для цепочки обмена, поэтому многие образцы и движки по умолчанию используют его. Тем не менее, если вы не пытаетесь поддерживать оригинальную Windows RT на устройствах ARM, современные игры и образцы все равно будут использовать уровень аппаратных функций Direct3D 10.0 или выше как минимум, так что вы можете практически использовать любой из допустимых форматов. перечисленных выше для цепочки обмена.
Для Direct3D 11 вы также должны использовать
D3D11_CREATE_DEVICE_BGRA_SUPPORTв качестве проверки безопасности. Действительно старые драйверы WDDM первого поколения на самом деле не имели поддержки BGRA, и это проверяет этот пограничный случай как часть создания устройства. На практике любой драйвер более новый, чем эра Windows Vista RTM, будет его поддерживать. Этот флаг также необходим при взаимодействии с Direct2D/DirectWrite, поскольку он поддерживает только форматы BGRA (первоначальный GDI Windows был только BGRA).
См. также эту серию сообщений в блоге, в частности, чтобы узнать о некоторых особенностях того, как в наши дни обрабатываются форматы _SRGB.
Еще одна мелочь BGRA и RGBA DirectX: существует давняя ошибка в том, как форматы пикселей 10bpp BGRA и RGBA кодировались в файлах
DDSиз-за симметричной ошибки в устаревшей библиотеке D3DX. См. этот пост в блоге для деталей.
И почему 32-битный цвет вместо 256-битного? Вы имели в виду 8-битный цвет с палитрой?