Как исправить эту ошибку мультисэмплинга при создании swapchain? - PullRequest
1 голос
/ 24 мая 2019

Я получаю DXGI ERROR о мультисэмплинге при создании цепочки подкачки и мне нужна помощь после нескольких часов попыток устранить эту ошибку.

Я настраиваю простое окно для изучения Direct3D 11. Я попытался изменить SampleDesc.Count и SampleDesc.Quality в структуре DXGI_SWAP_CHAIN_DESC1, но я все еще получаю ошибку.

// dxgiFactory is using interface IDXGIFactory7
// d3dDevice5 is using interface ID3D11Device5

ComPtr<IDXGISwapChain1> dxgiSwapChain1;

DXGI_SWAP_CHAIN_DESC1 desc;
desc.Width = 800;
desc.Height = 400;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.Stereo = FALSE;
desc.SampleDesc.Count = 0;
desc.SampleDesc.Quality = 0;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.BufferCount = 3;
desc.Scaling = DXGI_SCALING_STRETCH;
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
desc.AlphaMode = DXGI_ALPHA_MODE_STRAIGHT;
desc.Flags = 0;

hr = dxgiFactory->CreateSwapChainForHwnd(d3dDevice5.Get(), hWnd, &desc, nullptr, nullptr, &dxgiSwapChain1);

Отладочный вывод:

DXGI ERROR: IDXGIFactory::CreateSwapChain: Flip model swapchains (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL and DXGI_SWAP_EFFECT_FLIP_DISCARD) do not support multisampling.

Как мне устранить эту ошибку?

1 Ответ

0 голосов
/ 24 мая 2019

TL; DR Либо измените модель сальто на более старую DXGI_SWAP_EFFECT_DISCARD, либо создайте цель рендеринга MSAA, которую вы явно разрешите.

  1. Создайте цепочку обмена как один пример(т.е. без MSAA).
  2. Создайте целевую текстуру рендеринга, использующую один или несколько образцов (например, MSAA).
  3. Создание представления цели рендеринга для цели рендеринга MSAA
  4. Каждый кадр, рендеринг в цель рендеринга MSAA, затем ResolveSubresource в буфер буфера обмена swapchain или в какой-либо другой буфер для одного образца.-, затем Present.

Подробный пример кода см. GitHub .

Вы также не можете создать его как DXGI_FORMAT_*_SRGB гамма-корректирующий swapchain с новыми DXGI_SWAP_EFFECT_FLIP_* моделями.Вы можете создать представление цели рендеринга, равное DXGI_FORMAT_*_SRGB для цепочки подкачки, которая не является sRGB, чтобы получить тот же эффект.Немного трудновато делать MSAA и sRGB вместе с новыми моделями флип, которые исправлены в Windows 10 Fall Creators Update (16299) или более поздней версии.

Если вы использовали DirectX 12, вы неу вас есть возможность использовать более старые эффекты подкачки, поэтому вам нужно напрямую реализовать цель рендеринга MSAA.Опять же, см. GitHub .

В дни до Pre-Directx 12 / Vulkan DirectX облегчал включение MSAA, выполняя кучу вещей за кулисами для вас.,Это создаст цель рендеринга не-MSAA для отображения, вернет вам цель рендеринга MSAA для рендеринга и выполнит для вас разрешение как часть Present.Это было легко, но также было немного расточительно.

С новым подходом DirectX 12 «без магии», вы должны сделать это явно в приложении.В реальных играх вы хотите сделать это в любом случае, потому что вы обычно выполняете много постобработки и хотите выполнить разрешение задолго до Present или даже выполнить другие виды разрешения (FXAA, MLAA, SMAA).Например:

Render 3D scene to a floating-point MSAA render target
->
Resolve to a single-sample floating-point render target
->
Perform tone-mapping/color-grading/blur/bloom/etc.
->
Render UI/HUD
->
Perform HDR10 signal generation/gamma-correction/color-space warp
->
Present

Как вы можете видеть из этого потока, довольно глупо когда-либо иметь подмену MSAA, за исключением примеров игрушек или примеров кода.

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

См. DirectX Tool Kit для DX 11 и DX12

...