2017-03-03 4 views
1

Salut, je commence juste avec DirectX sous CoreWindow^+ C++/CLI, tout semble être ok jusqu'à ce que je veux commencer à utiliser un multi-échantillonnage. Cet exemple est rendu le traingle simple,Comment remplir correctement SwapChain Struct pour utiliser le multi-échantillonnage?

Working example without AA

Quand je remplis le struct SwapChain comme ceci:

UINT m4xMsaaQuality; 


dev->CheckMultisampleQualityLevels(DXGI_FORMAT_B8G8R8A8_UNORM,4, &m4xMsaaQuality); 


// set up the swap chain description 
DXGI_SWAP_CHAIN_DESC1 scd = { 0 }; 

scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // how the swap chain should be used 
scd.BufferCount =2;  

scd.Format = DXGI_FORMAT_B8G8R8A8_UNORM;    // the most common swap chain format 
scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; // the recommended flip mode 
scd.SampleDesc.Count = 4;        // >1 enable anti-aliasing 
scd.SampleDesc.Quality = m4xMsaaQuality-1; 

CoreWindow^ Window = CoreWindow::GetForCurrentThread(); // get the window pointer 

                  // create the swap chain 
dxgiFactory->CreateSwapChainForCoreWindow(
    dev.Get(),         // address of the device 
    reinterpret_cast<IUnknown*>(Window),  // address of the window 
    &scd,          // address of the swap chain description 
    nullptr,         // advanced 
    &swapchain);        // address of the new swap chain pointer 



    // get a pointer directly to the back buffer 
    ComPtr<ID3D11Texture2D> backbuffer; 
    swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (&backbuffer));` 

le

dxgiFactory->CreateSwapChainForCoreWindow(
dev.Get(),         // address of the device 
reinterpret_cast<IUnknown*>(Window),  // address of the window 
&scd,          // address of the swap chain description 
nullptr,         // advanced 
&swapchain); 

retour "nullptr",

J'ai vérifié que m4xMsaaQuality est equa l "17" so scd.SampleDesc.Quality = 16

Comment dois-je remplir la structure SwapChain?

Répondre

0

Les effets de permutation de bascule ne sont pas compatibles avec une surface multi-échantillonnage. Vous devez créer une chaîne d'échange non-msaa et résoudre explicitement votre rendu msaa dans les tampons swapchain.

0

Merci pour votre réponse, j'ai lu dans MSDN à propos de multi-échantillonnage dans l'application UWP. Mais je ne peux toujours pas rendre le trait lisse. J'ai changé la manière de swaping - maintenant devrait être correcte pour l'application UWP. J'ai également utilisé le ResolveSubresource

Pouvez-vous jeter un oeil? La fenêtre est complètement noire sans triangle. Jusqu'à présent, je fini avec ce code, surtout, je soupçonne que le rendu bacause cible quand je décommenter ceci:

dev->CreateRenderTargetView(backbuffer.Get(), &renderTargetViewDesc, &rendertarget); 

Et dans la méthode de rendu [ligne: 210, 214] utiliser "RenderTarget"

[210] devcon->OMSetRenderTargets(1, rendertarget.GetAddressOf(), nullptr); 

[214]devcon->ClearRenderTargetView(rendertarget.Get(), color); 

Tout retour à la normale (bien sûr sans MSAA)

Init_DirectX - render fail

0

OUI! Enfin, je menage utiliser ce multiéchantillonnage, je me rends compte que
ResolveSubresource

Copier une ressource multiéchantillonné en une ressource non multiéchantillonné.

Voilà pourquoi je n'ai pas besoin de recréer une fois de plus le RenderViewTarget, juste je peux utiliser mon.

Je ai encore une question est il ya un moyen d'augmenter l'anti-aliasing? L'échantillon maximum de ce que je peux mettre en offScreenSurfaceDesc.SampleDesc.Count est 8.

Init_DirectX with MSAA enable

Voici la solution de travail.