首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MSAA创建交换链失败

使用MSAA创建交换链失败
EN

Stack Overflow用户
提问于 2016-10-18 14:17:40
回答 1查看 1.7K关注 0票数 0

当我尝试设置一个带有MSAA支持的交换链时,我会得到一个DXGI_ERROR_INVALID_CALL错误--下面是创建交换链的代码:

代码语言:javascript
复制
// Describe and create the swap chain.
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
swapChainDesc.BufferCount = frameCount_;
swapChainDesc.Width = static_cast<UINT>(rsd.width);
swapChainDesc.Height = static_cast<UINT>(rsd.height);
swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;

if (rsd.enableMSAA) {
    swapChainDesc.SampleDesc = findBestMSAASetttings(swapChainDesc.Format);
}

ComPtr<IDXGISwapChain1> swapChain;

HRESULT hr = factory_->CreateSwapChainForHwnd(commandQueue_.Get(), // Swap chain needs the queue so that it can force a flush on it.
                                                  hWnd, &swapChainDesc, nullptr, nullptr, &swapChain);

查找最佳可用MSAA设置的方法如下所示:

代码语言:javascript
复制
DXGI_SAMPLE_DESC D3D12RenderSystem::findBestMSAASetttings(DXGI_FORMAT format)
{
    HRESULT hr = S_FALSE;

    // The default sampler mode, with no anti-aliasing, has a count of 1 and a quality level of 0.
    UINT maxQualityLevel = 0;
    UINT respectiveSampleCount = 1;

    // If anti-aliasing is activated the best possible sample and quality level is chosen.
    // Find highest available sample count and quality level
    for (UINT sampleCount = 1; sampleCount <= D3D12_MAX_MULTISAMPLE_SAMPLE_COUNT; sampleCount++) {
        D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS msaaQualityDesc{};
        msaaQualityDesc.SampleCount = sampleCount;
        msaaQualityDesc.Format = format; // DXGI_FORMAT_R8G8B8A8_UNORM;
        msaaQualityDesc.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE;
        msaaQualityDesc.NumQualityLevels = 0;

        hr = device_->CheckFeatureSupport(D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS, &msaaQualityDesc, sizeof(msaaQualityDesc));
        if (hr != S_OK) {
            BLUE_LOG(error) << "CheckMultisampleQualityLevels failed.";
        }
        if (msaaQualityDesc.NumQualityLevels > 0) {
            BLUE_LOG(trace) << "MSAA with sampleCount " << msaaQualityDesc.SampleCount << " and qualtiy level " << msaaQualityDesc.NumQualityLevels << " supported.";

            if (maxQualityLevel <= msaaQualityDesc.NumQualityLevels) {
                maxQualityLevel = msaaQualityDesc.NumQualityLevels;
                respectiveSampleCount = sampleCount;
            }
        }
    }

    BLUE_ASSERT(hr == S_OK, "find best MSAA setting failed.")

    DXGI_SAMPLE_DESC sd;
    sd.Count = respectiveSampleCount;
    sd.Quality = maxQualityLevel;

    return sd;
}

rsd.enableMSAAfalse时,一切都是完美的。

我的设备是这样创建的(我使用的是warp适配器,因为我没有硬件支持):

代码语言:javascript
复制
throwIfFailed(factory_->EnumWarpAdapter(IID_PPV_ARGS(&warpAdapter)));
            throwIfFailed(D3D12CreateDevice(warpAdapter.Get(), featureLevel_, IID_PPV_ARGS(&device_)));

我的日志上说:

代码语言:javascript
复制
trace | D3D12RenderSystem::findBestMSAASetttings | MSAA with sampleCount 1 and qualtiy level 1 supported.
trace | D3D12RenderSystem::findBestMSAASetttings | MSAA with sampleCount 2 and qualtiy level 1 supported.
trace | D3D12RenderSystem::findBestMSAASetttings | MSAA with sampleCount 4 and qualtiy level 1 supported.
trace | D3D12RenderSystem::findBestMSAASetttings | MSAA with sampleCount 8 and qualtiy level 1 supported.
trace | D3D12RenderSystem::findBestMSAASetttings | MSAA with sampleCount 16 and qualtiy level 1 supported.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-18 14:40:23

https://github.com/Microsoft/DirectXTK12/wiki/Simple-rendering说:

Direct3D 12不支持创建MSAA交换链--创建SampleDesc.Count >1的交换链的尝试将失败。相反,您可以创建自己的MSAA呈现目标,并显式地解析到DXGI后台缓冲区以供表示,如下所示。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40110699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档