總體來(lái)說(shuō)可以概括為以下幾個(gè)步驟:
- 創(chuàng)建Device和Context
- 創(chuàng)建SwapChain
- 為BackBuffer創(chuàng)建View
- 創(chuàng)建Depth/Stencil Buffer蜕衡,并為之創(chuàng)建View
- 將View綁定到Context中
- 設(shè)置Viewport
創(chuàng)建Device和Context
HRESULT D3D11CreateDevice(
IDXGIAdapter *pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
const D3D_FEATURE_LEVEL *pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
ID3D11Device **ppDevice,
D3D_FEATURE_LEVEL *pFeatureLevel,
ID3D11DeviceContext **ppImmediateContext
);
主要調(diào)用D3D11CreateDevice創(chuàng)建ID3D11Device和ID3D11DeviceContext。接口說(shuō)明可以查看API文檔赫舒。這里注意第四個(gè)參數(shù)Flags。在Windows10系統(tǒng)下嘹悼,如果要設(shè)置為D3D11_CREATE_DEVICE_DEBUG排苍,則必須安裝DirectX Graphics Tools。參見(jiàn)
創(chuàng)建SwapChain
HRESULT CreateSwapChain(
IUnknown *pDevice,
DXGI_SWAP_CHAIN_DESC *pDesc,
IDXGISwapChain **ppSwapChain
);
主要調(diào)用IDXGIFactory::CreateSwapChain創(chuàng)建IDXGISwapChain袁铐。接口說(shuō)明可以查看API文檔揭蜒。我們通過(guò)上一步創(chuàng)建的ID3D11Device來(lái)獲得IDXGIFactory:參見(jiàn)
IDXGIDevice * pDXGIDevice = nullptr;
hr = g_pd3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice);
IDXGIAdapter * pDXGIAdapter = nullptr;
hr = pDXGIDevice->GetAdapter( &pDXGIAdapter );
IDXGIFactory * pIDXGIFactory = nullptr;
pDXGIAdapter->GetParent(__uuidof(IDXGIFactory), (void **)&pIDXGIFactory);
其實(shí),我們也可以直接調(diào)用D3D11CreateDeviceAndSwapChain同時(shí)創(chuàng)建Device和SwapChain剔桨,但是DXGI_SWAP_CHAIN_DESC結(jié)構(gòu)中包含Multisample相關(guān)字段屉更,而在Device創(chuàng)建之前,是無(wú)法通過(guò)ID3D11Device::CheckMultisampleQualityLevels獲取到正確值的洒缀。
為BackBuffer創(chuàng)建View
創(chuàng)建SwapChain的時(shí)候BackBuffer已經(jīng)自動(dòng)創(chuàng)建好了瑰谜,我們只需做的是為它創(chuàng)建一個(gè)View。
HRESULT CreateRenderTargetView(
ID3D11Resource *pResource,
const D3D11_RENDER_TARGET_VIEW_DESC *pDesc,
ID3D11RenderTargetView **ppRTView
);
View的用處其實(shí)就是用來(lái)指定的Buffer的用法树绩,這樣同一塊Buffer可以多次復(fù)用萨脑。一個(gè)Buffer可以對(duì)應(yīng)多個(gè)View。
創(chuàng)建Depth/Stencil Buffer葱峡,并為之創(chuàng)建View
HRESULT CreateTexture2D(
const D3D11_TEXTURE2D_DESC *pDesc,
const D3D11_SUBRESOURCE_DATA *pInitialData,
ID3D11Texture2D **ppTexture2D
);
HRESULT CreateDepthStencilView(
ID3D11Resource *pResource,
const D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc,
ID3D11DepthStencilView **ppDepthStencilView
);
首先通過(guò)ID3D11Device::CreateTexture2D創(chuàng)建出Buffer砚哗,然后調(diào)用ID3D11Device::CreateDepthStencilView創(chuàng)建View。值得注意的是砰奕,D3D11_TEXTURE2D_DESC結(jié)構(gòu)中的Usage字段:參見(jiàn)
Resource Usage | Default | Dynamic | Immutable | Staging |
---|---|---|---|---|
GPU-Read | yes | yes | yes | yes |
GPU-Write | yes | yes | ||
CPU-Read | yes | |||
CPU-Write | yes | yes |
將View綁定到Context中
void OMSetRenderTargets(
UINT NumViews,
ID3D11RenderTargetView * const *ppRenderTargetViews,
ID3D11DepthStencilView *pDepthStencilView
);
ID3D11DeviceContext負(fù)責(zé)綁定View蛛芥。
設(shè)置Viewport
void RSSetViewports(
UINT NumViewports,
const D3D11_VIEWPORT *pViewports
);
ID3D11DeviceContext負(fù)責(zé)設(shè)置Viewport提鸟。