共用方式為


如何做:建立裝置和立即背景

本主題說明如何初始化 裝置。 初始化 裝置 是應用程式在轉譯場景之前必須先完成的第一項工作之一。

創建裝置及其相關上下文

請將緩衝區格式和尺寸的相關信息填入 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;

使用步驟一中的 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);if(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

> >  > >  >