Практическое руководство. Создание устройства и контекста интерпретации

В этом разделе показано, как инициализировать устройство. Инициализация устройства — это одна из первых задач, которые приложение должно выполнить, прежде чем вы сможете отобразить сцену.

Создание устройства и немедленного контекста

Заполните структуру 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;
}

Примечание.

Если вы запрашиваете устройство D3D_FEATURE_LEVEL_11_1 на компьютере только с средой выполнения Direct3D 11.0, 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* = nullptr; HRESULT hr = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, lvl, _countof(lvl), D3D11_SDK_VERSION, &g_pSwapChain, &g_pd3ddevice, &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, &g_pSwapChain, &g_pd3ddevice, &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

> >   > >   >