如何正确填充Swapchain结构以使用mulits采样

How to properly fill up SwapChain Struct to use Mulitsampling?

本文关键字:mulits 采样 结构 何正确 填充 Swapchain      更新时间:2023-10-16

嗨,我只是从corewindow^ c /cli下的directx开始,直到我想开始使用mulitsampling之前,一切似乎都可以。此示例正在渲染简单的三角形

没有AA

的工作示例

当我这样填充Swapchain结构时:

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));`

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);

返回" nullptr",

我检查了m4xmsaaquality等于" 17",所以scd.sampledesc.quality = 16

我应该如何填充Swapchain结构?

翻转交换效应与多样采样表面不兼容。您需要创建一个非MSAA互换链,并明确解决SAA渲染。

是!最终,我曾经使用这种多样采样,我意识到
esolvesubresource

将多样采样资源复制到非媒体采样资源中。

为什么我不必再重新创建renderviewtarget,只是我可以使用我的。

我仍然有疑问,是否有一些方法可以增加抗声明?我可以放入屏幕外的最大样本

insaa enable

init_directx

这是工作解决方案。

谢谢您的回答,我在MSDN中阅读了有关UWP应用中的多样采样。但是我仍然不能渲染光滑的三角形。我更改了交换方式 - 现在对于UWP应用程序应该是正确的。我还使用了asolvesubresource

你可以看看吗?窗户是完整的黑色,没有三角形。到目前为止,我完成了此代码,大多数情况下,我怀疑渲染目标时是:

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

和渲染方法[线:210,214]使用" rendertarget"

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

一切都恢复正常(当然没有MSAA)

init_directx-渲染失败