天天看點

D3D11中的裝置介紹

<b></b>



D3D11中的裝置介紹

Device Context可以被用于任何線程中,但一次隻能在一個線程中使用。

<b>建立WARP</b><b>和Reference</b><b>裝置的限制:</b>

(1)在D3D 11中

D3D_DRIVER_TYPE_WARP支援feature level從D3D_FEATURE_LEVEL_9_1

through D3D_FEATURE_LEVEL_10_1。

D3D_DRIVER_TYPE_REFERENCE支援所有的feature level。

11 device時,可以并且隻能使用上面的任意一種組合。

(2)在D3D 10.1中

D3D10_DRIVER_TYPE_WARP和D3D10_DRIVER_TYPE_REFERENCE支援feture

level從D3D10_FEATURE_LEVEL_10_0到D3D10_FEATURE_LEVEL_10_1

10.1 device時,可以并且隻能使用上面的任意一種組合。

<b>Swap</b>

Chain<b>(交換鍊)</b>

一個swap chain包含2個或多個buffers,用來render和display。它通常包含一個front buffer用來送出到顯示裝置,和一個back buffer用來作為render target。在immediate context完成render到後緩存後,swap chain并通過交換2個緩存來送出back buffer。

Swap chain包含了幾個渲染特征:

render區域的大小、display重新整理率、display模式、surface格式

通過填充一個DXGI_SWAP_CHAIN_DESC結構來定義swap chain的上述特征。如:

    DXGI_SWAP_CHAIN_DESC sd;

    ZeroMemory( &amp;sd, sizeof( sd ) );

    sd.BufferCount = 1;

    sd.BufferDesc.Width = 640;

    sd.BufferDesc.Height = 480;

    sd.BufferDesc.Format =

DXGI_FORMAT_R8G8B8A8_UNORM;

    sd.BufferDesc.RefreshRate.Numerator = 60;

    sd.BufferDesc.RefreshRate.Denominator = 1;

    sd.BufferUsage =

DXGI_USAGE_RENDER_TARGET_OUTPUT;

    sd.OutputWindow = g_hWnd;

    sd.SampleDesc.Count = 1;

    sd.SampleDesc.Quality = 0;

    sd.Windowed = TRUE;

建立Device和Swap Chain:

<b>枚舉GPU</b><b>裝置</b>

DX10、DX11使用DXGI枚舉一台機器上可獲得的圖形擴充卡。枚舉圖形裝置可以做以下事情:

(1)      

檢視機器上安裝了多少顯示卡

(2)      

可以幫助你選擇特定的顯示卡來建立D3D裝置

(3)      

<b>枚舉過程:</b>

(1)  

  IDXGIFactory * pFactory = NULL;

  CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&amp;pFactory)

<code>(2)  </code>通過IDXGIFactory::EnumAdapters函數查詢每個裝置<code></code>

  for (UINT i = 0;

     pFactory-&gt;EnumAdapters(i, &amp;pAdapter) != DXGI_ERROR_NOT_FOUND;

     ++i)

  { ... }

(3)  

調用IDXGIAdapter::EnumOutputs枚舉圖形裝置的輸出對象裝置

  IDXGIOutput* pOutput = NULL;

  HRESULT hr;

  //枚舉pAdapter的主輸出對象(顯示器)

  hr = pAdapter-&gt;EnumOutputs(0,&amp;pOutput);

(4)  

  UINT numModes = 0;

  DXGI_MODE_DESC* displayModes = NULL;

  DXGI_FORMAT format = DXGI_FORMAT_R32G32B32A32_FLOAT;

  // Get the number of elements

  hr = pOutput-&gt;GetDisplayModeList( format, 0, &amp;numModes, NULL);

  displayModes = new DXGI_MODE_DESC[numModes];

  // Get the list

  hr = pOutput-&gt;GetDisplayModeList( format, 0, &amp;numModes, displayModes);

<b> </b>

PS:cnblogs的文檔編輯敢不敢再強大一點,至少從word中複制的大括号可以粘貼上吧,畢竟圖檔效果不好。

繼續閱讀