Почему BGRA вместо RGBA?

Итак, я разрабатывал игровой движок на C++ и DirectX 11 и заметил, что люди обычно используют BGRA вместо RGBA в качестве формата SwapChain. Почему люди так делают? И почему 32-битный цвет вместо 256-битного?

Спасибо за ответы

И почему 32-битный цвет вместо 256-битного? Вы имели в виду 8-битный цвет с палитрой?

drescherjm 27.12.2022 01:32

Поскольку, насколько мне известно, контроллер дисплея в вашем графическом процессоре довольно часто работает с BGRA вместо RGBA, а предоставление графики в формате контроллера дисплея устраняет необходимость его преобразования.

Captain Obvlious 27.12.2022 02:39

Я нашел похожее обсуждение про vulkan и BGRA: https://www.reddit.com/r/vulkan/comments/p3iy0o/why_use_bgra‌​_instead_of_rgba/

drescherjm 27.12.2022 02:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Исторически сложилось так, что 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. См. этот пост в блоге для деталей.

Другие вопросы по теме