如何:创建设备和即时上下文

本主题演示如何初始化 设备。 初始化 设备 是应用程序在渲染场景之前必须完成的首批任务之一。

创建设备和即时上下文

使用有关缓冲区格式和维度的信息填写 DXGI_SWAP_CHAIN_DESC 结构。 有关详细信息,请参阅创建交换链。

下面的代码示例演示如何填充 DXGI_SWAP_CHAIN_DESC 结构。

DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory( &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;

使用步骤 1 中的 DXGI_SWAP_CHAIN_DESC 结构,调用 D3D11CreateDeviceAndSwapChain 以同时初始化设备和交换链。

D3D_FEATURE_LEVEL  FeatureLevelsRequested = D3D_FEATURE_LEVEL_11_0;
UINT               numLevelsRequested = 1;
D3D_FEATURE_LEVEL  FeatureLevelsSupported;

if( FAILED (hr = D3D11CreateDeviceAndSwapChain( NULL, 
                D3D_DRIVER_TYPE_HARDWARE, 
                NULL, 
                0,
                &FeatureLevelsRequested, 
                numFeatureLevelsRequested, 
                D3D11_SDK_VERSION, 
                &sd, 
                &g_pSwapChain, 
                &g_pd3dDevice, 
                &FeatureLevelsSupported,
                &g_pImmediateContext )))
{
    return hr;
}

注意

如果在仅使用 Direct3D 11.0 运行时的计算机上请求 D3D_FEATURE_LEVEL_11_1 设备, 则 D3D11CreateDeviceAndSwapChain 会立即退出 并E_INVALIDARG。 若要在具有 DirectX 11.0 或 DirectX 11.1 运行时的计算机上安全地请求所有可能的功能级别,请使用以下代码:

              
              const D3D_FEATURE_LEVEL lvl[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1 };

UINT createDeviceFlags = 0;#ifdef _DEBUG createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;#endif

ID3D11Device* device = nullptr;HRESULT hr = D3D11CreateDeviceAndSwapChain ( nullptr、D3D_DRIVER_TYPE_HARDWARE、nullptr、createDeviceFlags、lvl、_countof (lvl) 、D3D11_SDK_VERSION、 &sd、 &g_pSwapChain、 &g_pd3ddevice、 &FeatureLevelsSupported, &g_pImmediateContext ) ;如果 ( hr == E_INVALIDARG ) { hr = D3D11CreateDeviceAndSwapChain ( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, &lvl[1], _countof (lvl) - 1, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3ddevice, &FeatureLevelsSupported, &g_pImmediateContext ) ; }

if (FAILED(hr)) return hr;

 

通过调用 ID3D11Device::CreateRenderTargetView 创建呈现目标视图,并通过调用 ID3D11DeviceContext::OMSetRenderTargets 将后台缓冲区作为呈现目标绑定。

              
              ID3D11Texture2D* pBackBuffer;

获取指向后台缓冲区 hr = g_pSwapChain-GetBuffer> ( 0 的指针,__uuidof ( ID3D11Texture2D ) , ( LPVOID* ) &pBackBuffer ) ;

创建呈现目标视图 g_pd3dDevice-CreateRenderTargetView> ( pBackBuffer、NULL、 &g_pRenderTargetView ) ;

// Bind the view g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );

创建视区以定义呈现目标的哪些部分将可见。 使用 D3D11_VIEWPORT 结构定义视区,并使用 ID3D11DeviceContext::RSSetViewports 方法设置视区。

C++
    // Setup the viewport
    D3D11_VIEWPORT vp;
    vp.Width = 640;
    vp.Height = 480;
    vp.MinDepth = 0.0f;
    vp.MaxDepth = 1.0f;
    vp.TopLeftX = 0;
    vp.TopLeftY = 0;
    g_pImmediateContext->RSSetViewports( 1, &vp );

设备

如何使用 Direct3D 11

> >   > >   >