IDXGIFactory2::CreateSwapChainForCoreWindow 方法 (dxgi1_2.h)

建立與交換鏈結之輸出視窗 的 CoreWindow 物件相關聯的交換鏈結。

語法

HRESULT CreateSwapChainForCoreWindow(
  [in]           IUnknown                    *pDevice,
  [in]           IUnknown                    *pWindow,
  [in]           const DXGI_SWAP_CHAIN_DESC1 *pDesc,
  [in, optional] IDXGIOutput                 *pRestrictToOutput,
  [out]          IDXGISwapChain1             **ppSwapChain
);

參數

[in] pDevice

針對 Direct3D 11 和舊版 Direct3D,這是交換鏈結 Direct3D 裝置的指標。 針對 Direct3D 12,這是直接命令佇列的指標, (參考 ID3D12CommandQueue) 。 此參數不可為 NULL

[in] pWindow

CreateSwapChainForCoreWindow 所建立之交換鏈結相關聯的 CoreWindow 物件的指標。

[in] pDesc

交換鏈結描述 之DXGI_SWAP_CHAIN_DESC1 結構的指標。 此參數不可為 NULL

[in, optional] pRestrictToOutput

交換鏈結受限於的 IDXGIOutput 介面指標。 如果交換鏈結移至不同的輸出,則內容會是黑色。 您可以選擇性地將此參數設定為使用 DXGI_PRESENT_RESTRICT_TO_OUTPUT 來限制此輸出內容的輸出目標。 如果您未設定此參數來限制輸出目標上的內容,您可以將它設定為 NULL

[out] ppSwapChain

變數的指標,接收 CreateSwapChainForCoreWindow 所建立之交換鏈結的 IDXGISwapChain1 介面指標。

傳回值

CreateSwapChainForCoreWindow 會傳回:

  • 如果已成功建立交換鏈結,S_OK。
  • 如果記憶體無法完成作業,E_OUTOFMEMORY。
  • DXGI_ERROR_INVALID_CALL 如果呼叫應用程式提供無效的數據,例如 ,如果 pDescppSwapChainNULL
  • 您可能 DXGI_ERROR主題中所述 的其他錯誤碼,這些錯誤碼是由您傳遞給 pDevice 的裝置類型所定義。

適用於 Windows 7 的平臺更新: 在已安裝 Windows 7 平臺更新 的 Windows 7 或 Windows Server 2008 R2 上, CreateSwapChainForCoreWindow 會失敗並E_NOTIMPL。 如需 Windows 7 平臺更新的詳細資訊,請參閱 適用於 Windows 7 的平臺更新

備註

注意 在 Windows 市集應用程式中使用這個方法,而不是 IDXGIFactory2::CreateSwapChainForHwnd
 
如果您指定 pDesc 指向) 交換鏈結) 的寬度、高度或兩者 (WidthHeightDXGI_SWAP_CHAIN_DESC1 成員,運行時間就會從 pWindow 參數指定的輸出視窗中取得大小。

您接著可以呼叫 IDXGISwapChain1::GetDesc1 方法來擷取指派的寬度或高度值。

由於您一次只能將一個翻轉簡報模型交換鏈結 () 與 CoreWindow 產生關聯,因此如果您嘗試終結翻轉簡報模型交換鏈結,並將它取代為另一個交換鏈結,Microsoft Direct3D 11 原則可能會造成問題。 如需這種情況的詳細資訊,請參閱 翻轉簡報交換鏈結的延後解構問題

如需如何為交換鏈結的後台緩衝區選擇格式的詳細資訊,請參閱 轉換色彩空間的數據

重疊交換鏈結

從 Windows 8.1 開始,您可以在前景圖層中建立額外的交換鏈結。 前景交換鏈結可用來以原生解析度呈現UI元素,同時在背景交換鏈結中相應增加即時轉譯, (例如遊戲) 。 這可啟用需要較低解析度轉譯才能加快填滿率,但不犧牲 UI 品質的案例。

前景交換鏈結的建立方式是在 pDesc 指向的DXGI_SWAP_CHAIN_DESC1中設定DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER交換鏈結旗標。 前景交換鏈結也必須使用 DXGI_ALPHA_MODE_PREMULTIPLIED Alpha 模式,而且必須使用 DXGI_SCALING_NONE。 預乘 Alpha 表示每個圖元的色彩值應該已經乘以 Alpha 值,再顯示畫面。 例如,50% Alpha 的 100% 白色 BGRA 像素會設為 (0.5, 0.5, 0.5, 0.5)。 alpha 預乘步驟可以在輸出合併階段中完成,方法是套用應用程式混合狀態 (請參閱 ID3D11BlendState) ,並將 D3D11_RENDER_TARGET_BLEND_DESC 結構的 SrcBlend 字段設定為 D3D11_SRC_ALPHA。 如果 Alpha 預乘步驟尚未完成,前景交換鏈結上的色彩將會較預期的明亮。

如果硬體支援,前景交換鏈結將會使用多平面重疊。 呼叫 IDXGIOutput2::SupportsOverlays 以查詢配接器以取得重迭支援。

下列範例會建立 CoreWindow 的前景交換鏈結:


DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 };

swapChainDesc.Width = static_cast<UINT>(m_d3dRenderTargetSize.Width);
swapChainDesc.Height = static_cast<UINT>(m_d3dRenderTargetSize.Height);
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
swapChainDesc.Stereo = false;
swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling.
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 2;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER;
swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_PREMULTIPLIED;
swapChainDesc.Scaling = DXGI_SCALING_NONE;

ComPtr<IDXGISwapChain1> swapChain;
HRESULT hr = dxgiFactory->CreateSwapChainForCoreWindow(
    m_d3dDevice.Get(),
    reinterpret_cast<IUnknown*>(m_window.Get()),
    &swapChainDesc,
    nullptr,
    &swapChain
    );

在轉譯完成之後,將這兩個交換鏈結一起呈現。

下列範例顯示這兩個交換鏈結:


HRESULT hr = m_swapChain->Present(1, 0);

if (SUCCEEDED(hr) && m_foregroundSwapChain)
{
    m_foregroundSwapChain->Present(1, 0);
}

規格需求

需求
最低支援的用戶端 適用於 Windows 7 的 Windows 8 和平臺更新 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 適用於 Windows Server 2008 R2 的 Windows Server 2012 和平臺更新 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 dxgi1_2.h
程式庫 Dxgi.lib

另請參閱

CoreWindow

為了獲得最佳效能,請使用 DXGI 翻轉模型

IDXGIFactory2