Почему D3D11CreateDeviceAndSwapChain завершится ошибкой, если задан формат пикселя заднего буфера DXGI_FORMAT_B8G8R8X8_UNORM? - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь перенести часть кода Direct3D 9 на Direct3D 11. Исходный код использует адаптер формата D3DFMT_X8R8G8B8.Я искал MSDN и нашел эквивалент в Direct3D 11 DXGI_FORMAT_B8G8R8X8_UNORM.Вот мой модифицированный код для Direct3D 11 после создания окна:

DXGI_SWAP_CHAIN_DESC swap_chain_description;
ZeroMemory(&swap_chain_description, sizeof swap_chain_description);
swap_chain_description.BufferDesc.Width = window_width;
swap_chain_description.BufferDesc.Height = window_height;
swap_chain_description.BufferDesc.RefreshRate.Denominator = 1;
swap_chain_description.BufferDesc.Format = DXGI_FORMAT_B8G8R8X8_UNORM;
swap_chain_description.SampleDesc.Count = 1;
swap_chain_description.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swap_chain_description.BufferCount = 1;
swap_chain_description.OutputWindow = hWnd;
swap_chain_description.Windowed = TRUE;
swap_chain_description.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swap_chain_description.Flags = 0;

HRESULT hr = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swap_chain_description, &dxgi_swap_chain, &d3d11_device, supported_feature_level, &d3d11_device_context);
if (FAILED(hr)) {
    return EXIT_FAILURE;
}

Мой код с треском провалился, когда D3D11CreateDeviceAndSwapChain вернул E_INVALIDARG.Я изменил BufferDesc.Format на DXGI_FORMAT_R8G8B8A8_UNORM и функция вернула S_OK, как и предполагалось.Почему это случилось?Это DXGI_FORMAT_B8G8R8X8_UNORM осуждается или что-то еще, что мне не известно?

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Для Direct3D 11 вы должны ознакомиться с аппаратными уровнями Direct3D - см. в этом блоге для получения дополнительной информации.Современный Direct3D поддерживает только определенный набор форматов для «отображения» (то есть, буфер), обозначенный D3D11_FORMAT_SUPPORT_DISPLAY.Они поддерживаются всем совместимым с Direct3D 11 оборудованием (уровни функций 9.1 - 12.1):

DXGI_FORMAT_R8G8B8A8_UNORM
DXGI_FORMAT_B8G8R8A8_UNORM

DXGI_FORMAT_R8G8B8A8_UNORM_SRGB и B8G8R8A8_UNORM_SRGB также поддерживаются в качестве форматов буферного буфера при использовании «старых» стилей представления,но не поддерживаются напрямую для новых моделей в стиле флип DXGI_SWAP_EFFECT_FLIP_*.В этих случаях вы предоставляете формат *_SRGB только для целевого представления рендеринга, а не для самого буфера.

Аппаратный уровень Direct3D 10.0 или выше также поддерживает:

DXGI_FORMAT_R16G16B16A16_FLOAT
DXGI_FORMAT_R10G10B10A2_UNORM

См. Анатомия Direct3D 11 Создание устройства

Если вы используете Windows 8.1 или Windows 10 для своей машины разработки, вы также должны посмотреть, как включить DXGI Debug Layer , поскольку это дало бы дополнительную информацию для этого сбоя.

DXGI WARNING: IDXGIFactory::CreateSwapChain: Blt-model swap effects (DXGI_SWAP_EFFECT_DISCARD and DXGI_SWAP_EFFECT_SEQUENTIAL)
are legacy swap effects that are predominantly superceded by their
flip-model counterparts (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL and DXGI_SWAP_EFFECT_FLIP_DISCARD).
Please consider updating your application to leverage flip-model swap effects
to benefit from modern presentation enhancements. More information
is available at http://aka.ms/dxgiflipmodel. [ MISCELLANEOUS WARNING #294: ]

DXGI ERROR: IDXGIFactory::CreateSwapChain: Flip model swapchains (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
and DXGI_SWAP_EFFECT_FLIP_DISCARD) only support the following Formats:
(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R10G10B10A2_UNORM), assuming
the underlying Device does as well.
DXGI_SWAP_CHAIN_DESC{ SwapChainType = ..._HWND, BufferDesc = DXGI_MODE_DESC1{Width = 800, Height = 600, RefreshRate = DXGI_RATIONAL{ Numerator = 0, Denominator = 0 }, Format = B8G8R8X8_UNORM, ScanlineOrdering = ..._UNSPECIFIED, Scaling = ..._UNSPECIFIED, Stereo = FALSE }, SampleDesc = DXGI_SAMPLE_DESC{ Count = 1, Quality = 0 }, BufferUsage = 0x20, BufferCount = 2, OutputWindow = 0x0023094C, Scaling = ..._STRETCH, Windowed = TRUE, SwapEffect = ..._FLIP_DISCARD, AlphaMode = ..._IGNORE, Flags = 0x0 }[ MISCELLANEOUS ERROR #101: ]
0 голосов
/ 27 сентября 2019

Теперь я никогда не кодировал в Direct3D, но, как я вижу, это универсально.

D3DFMT_X8R8G8B8 в соответствии с MSDN 32-битный формат пикселей RGB, где 8 бит зарезервированы для каждого цвета.Это означает, что альфа отсутствует, первый байт не используется.

Выбранный вами аналог аналогичен - альфа отсутствует.MSDN: четырехкомпонентный 32-разрядный формат беззнакового нормализованного целого числа, который поддерживает 8 битов для каждого цветового канала и 8 неиспользуемых битов.

Последний формат фактически не является аналогом, поскольку он размещает цвета в разных байтах.но это не должно иметь значения, если вы правильно визуализируете все текстуры.

Я думаю, что проблема в том, что ваше оборудование не поддерживает формат не-альфа.Вы пытались запустить старый код на том же оборудовании?И вы уверены, что старый DX3D не добавляет альфа-канал молча?Обычно API запрашивает драйвер о поддерживаемых форматах и ​​пытается сопоставить его с вашим.При неудаче он выдаст такую ​​ошибку. Кроме того, некоторые драйверы не принимают формат не-альфа для аппаратных буферов. Именно поэтому формат R8G8B8A8 работает, поскольку он поддерживает альфа-канал.

...