天天看点

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中复制的大括号可以粘贴上吧,毕竟图片效果不好。

继续阅读