填充DXGI_SWAP_CHAIN_DESC結構體來描述我們将要建立的交換鍊的特性。
Typedef struct DXGI_SWAP_CHAIN_DESC {
DXGI_MODE_DESC BufferDesc;
DXGI_SAMPLE_DESC SampleDesc;
DXGI_USAGE BufferUsage;
UINT BufferCount;
HWND OutputWindow;
BOOL Windowed;
DXGI_SWAP_EFFECT SwapEffect;
UINT Flags;
}DXGI_SWAP_CHAIN_DESC;
Typedef struct DXGI_MODE_DESC {
UINT Width; //背景緩沖區寬度
UINT Height; //背景緩沖區高度
DXGI_RATIONAL RefreshRate; //顯示重新整理率
DXGI_FORMAT Format; //背景緩沖區像素格式
DXGI_MODE_SCANLINE_ORDER ScanlineOrdering; //displayscanlinemode
DXGI_MODE_SCALING Scaling; //displayscalingmode
}DXGI_MODE_DESC;
參數說明:
1.BufferDesc:該結構體描述了我們所要建立的背景緩沖區的屬性。我們主要關注的屬性有:寬度、高度和像素格式;其他屬性的詳情請參閱SDK文檔。
2.SampleDesc:多重采樣數量和品質級别。
3.BufferUsage:設為DXGI_USAGE_RENDER_TARGET_OUTPUT,因為我們要将場景渲染到背景緩沖區(即,将它用作渲染目标)。
4.BufferCount:交換鍊中的背景緩沖區數量;我們一般隻用一個背景緩沖區來實作雙緩存。當然,你也可以使用兩個背景緩沖區來實作三緩存。
5.OutputWindow:我們将要渲染到的視窗的句柄。
6.Windowed:當設為true時,程式以視窗模式運作;當設為false時,程式以全屏(full-screen)模式運作。
7.SwapEffect:設為DXGI_SWAP_EFFECT_DISCARD,讓顯示卡驅動程式選擇最高效的顯示模式。
8.Flags:可選的标志值。如果設為DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH,那麼當應用程式切換到全屏模式時,Direct3D會自動選擇與目前的背景緩沖區設定最比對的顯示模式。如果未指定該标志值,那麼當應用程式切換到全屏模式時,Direct3D會使用目前的桌面顯示模式。
交換鍊(IDXGISwapChain)是通過IDXGIFactory執行個體的IDXGIFactory::CreateSwapChain方法建立的:
HRESULT IDXGIFactory::CreateSwapChain(IUnknown *pDevice,DXGI_SWAP_CHAIN_DESC *pDesc,IDXGISwapChain **ppSwapChain);
我們可以通過CreateDXGIFactory(需要連結dxgi.lib)擷取指向一個IDXGIFactory執行個體的指針。
- *pDevice, //指向ID3D11Device的指針
- *pDesc, //指向一個交換鍊描述的指針
- **ppSwapChain); //傳回建立後的交換鍊
代碼:
IDXGIDevice *dxgiDevice=0;
HR(md3dDevice->QueryInterface(__uuidof(IDXGIDevice),(void**)&dxgiDevice));
IDXGIAdapter *dxgiAdapter=0;
HR(dxgiDevice->GetParent(__uuidof(IDXGIAdapter),(void**))&dxgiAdapter));
//獲得IDXGIFactory接口
IDXGIFactory *dxgiFactory=0;
HR(dxgiAdapter->GetParent(__uuidof(IDXGIFactory),(void**))&dxgiFactory));
//現在,建立交換鍊
IDXGISwapChain*mSwapChain;
HR(dxgiFactory->CreateSwapChain(md3dDevice,&sd,&mSwapChain);
//釋放COM接口
ReleaseCOM(dxgiDevice;
ReleaseCOM(dxgiAdapter);
ReleaseCOM(dxgiFactory);
或者使用D3D11CreateDeviceAndSwapChain方法同時建立裝置、裝置上下文和交換鍊。