【问题标题】:Direct2D Create SwapChainDirect2D 创建交换链
【发布时间】:2014-02-12 04:22:10
【问题描述】:

我正在尝试根据 Windows 教程编写 Direct2D 桌面应用程序,但在创建 SwapChain1 时遇到问题。在下面的代码中,一切都被初始化,直到 CreateSwapChainForHwnd。指针 m_pDXGISwapChain1 保持为 NULL。除了 pOutput 之外的所有指针都是 ComPtrs。

D2D1_FACTORY_OPTIONS options;
ZeroMemory(&options, sizeof(D2D1_FACTORY_OPTIONS));

HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,
                                __uuidof(ID2D1Factory1), &options, &m_pD2DFactory1);
if(SUCCEEDED(hr))
{
    UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
    D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0 };
    hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, 0, creationFlags,     
        featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &m_pD3DDevice, 
        &m_featureLevel, &m_pD3DDeviceContext);
}

if(SUCCEEDED(hr))
    hr = m_pD3DDevice.As(&m_pDXGIDevice1);

if(SUCCEEDED(hr))
    hr = m_pD2DFactory1->CreateDevice(m_pDXGIDevice1.Get(), &m_pD2DDevice);

if(SUCCEEDED(hr))
    hr =  m_pD2DDevice->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &m_pD2DDeviceContext);

 if(SUCCEEDED(hr))
    hr = m_pDXGIDevice1->GetAdapter(&m_pDXGIAdapter); 

 if(SUCCEEDED(hr))
    hr = m_pDXGIAdapter->GetParent(IID_PPV_ARGS(&m_pDXGIFactory2));

DXGI_SWAP_CHAIN_DESC1 swapChainDesc1 = {0};
swapChainDesc1.Width = 0; 
swapChainDesc1.Height = 0;
swapChainDesc1.Format = DXGI_FORMAT_B8G8R8A8_UNORM;      
swapChainDesc1.Stereo = false; 
swapChainDesc1.SampleDesc.Count = 1;   
swapChainDesc1.SampleDesc.Quality = 0;
swapChainDesc1.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc1.BufferCount = 2;   
swapChainDesc1.Scaling = DXGI_SCALING_NONE;
swapChainDesc1.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
swapChainDesc1.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
swapChainDesc1.Flags = 0;

IDXGIOutput *pOutput;
m_pDXGIAdapter->EnumOutputs(0, &pOutput);

if(SUCCEEDED(hr))
   hr = m_pDXGIFactory2->CreateSwapChainForHwnd(
            static_cast<IUnknown*>(m_pD3DDevice.Get()), m_hwnd, &swapChainDesc1, 
            NULL, pOutput, &m_pDXGISwapChain1);

if(SUCCEEDED(hr))
    hr = m_pDXGIDevice1->SetMaximumFrameLatency(1);

if(SUCCEEDED(hr))
    hr = m_pDXGISwapChain1->GetBuffer(0, IID_PPV_ARGS(&m_pDXGIBackBuffer));

【问题讨论】:

    标签: direct2d


    【解决方案1】:

    如果你所有的指针都是ComPtr,那么调用应该是这样的:

    ComPtr<ID3D11Device> d3dDevice;
    ComPtr<IDXGIFactory2> dxgiFactory;
    

    // 假设 d3dDevice 和 dxgiFactory 已正确初始化:

    ComPtr<IDXGISwapChain1> swapChain;
    dxgiFactory->CreateSwapChainForHwnd(d3dDevice.Get(), hWnd, &swapChainDescription, nullptr, nullptr, swapChain.GetAddressOf())
    

    至于你的交换链描述,如果你制作的是非 Windows Store App,你应该设置

    swapChainDescription.Scaling = DXGI_SCALING_STRETCH;
    swapChainDescription.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
    

    这两个值都是0,所以你可以忽略它们。

    这是我使用的完整交换链描述:

    DXGI_SWAP_CHAIN_DESC1 swapChainDescription = {};
    swapChainDescription.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    swapChainDescription.SampleDesc.Count = 1;
    swapChainDescription.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    swapChainDescription.BufferCount = 2;
    

    有关如何正确设置 Direct2D 1.1 的完整演练,请参阅本文 - 包括 CreateSwapChainForHwnd 调用:http://msdn.microsoft.com/en-us/magazine/dn198239.aspx

    【讨论】:

      【解决方案2】:

      Direct2D 在用户级别没有 SwapChain,SwapChain 是用于 Direct3D,我在您的帖子中看到了一些 DirectX 11 代码,您真的想要 Direct2D 吗?还是 Direct3D?

      【讨论】:

      • 是的,Direct2D 1.1 确实有一个“用户级别”的 SwapChain,需要您设置并使用它。 msdn.microsoft.com/en-us/magazine/dn198239.aspx
      • @d7samurai,确切地说,那是 DXGI,而不是 Direct2D,现在停止投票。
      • 好吧,您说“SwapChain 用于 Direct3D”,因此您自己无视 DXGI 的区别。因此,本着同样的简化精神,Direct2D (1.1) 在“用户级别”有一个 SwapChain,就像 Direct3D 有一个一样。而且,不,我没有投票给你。
      • @d7samurai 不,显然你不知道交换链的历史,Direct3D 9 有 swap chain interface,在 Direct3D 10/11 中移动到了DXGI,但 Direct2D 从来没有这样的界面,永远!并且您发布的链接使用 DXGI 创建交换链,这不是 Direct2D 的东西。你说Direct2D 1.1确实有SwapChain,请给出那个接口的链接。
      • 你没有得到它。 Direct3D 11 也没有 SwapChain 接口,它也是一个 DXGI 接口,就像 Direct2D 1.1 一样。我说过就像您说 DIRECT3D 就好像它有一个交换链接口一样,说 DIRECT2D 就好像它有一样是有效的(实际上两者都没有直接连接到他们的域的接口,但这不是重点)。这里的重点是,在您的回答中,您说的好像 Direct2D 中不需要 SwapChain(“SwapChain 用于 Direct3D”),但它确实如此!与 Direct3D 中需要它的方式完全相同。 Direct2D 建立在 Direct3D 之上。
      猜你喜欢
      • 1970-01-01
      • 2019-05-07
      • 2016-04-23
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多