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