天天看點

DirectX 11 學習筆記(3)- 建立交換鍊

填充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方法同時建立裝置、裝置上下文和交換鍊。