天天看点

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方法同时创建设备、设备上下文和交换链。