Vorgehensweise: Erstellen eines Geräts und eines unmittelbaren Kontexts

In diesem Thema wird gezeigt, wie Ein Gerät initialisiert wird. Das Initialisieren eines Geräts ist eine der ersten Aufgaben, die Ihre Anwendung ausführen muss, bevor Sie Ihre Szene rendern können.

So erstellen Sie ein Gerät und einen unmittelbaren Kontext

Füllen Sie die DXGI_SWAP_CHAIN_DESC-Struktur mit Informationen zu Pufferformaten und -dimensionen aus. Weitere Informationen finden Sie unter Erstellen einer Swap Chain.

Im folgenden Codebeispiel wird veranschaulicht, wie die DXGI_SWAP_CHAIN_DESC-Struktur ausgefüllt wird.

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;

Rufen Sie mithilfe der DXGI_SWAP_CHAIN_DESC-Struktur aus Schritt 1 D3D11CreateDeviceAndSwapChain auf, um das Gerät und die Swapchain gleichzeitig zu initialisieren.

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;
}

Hinweis

Wenn Sie ein D3D_FEATURE_LEVEL_11_1 Gerät auf einem Computer anfordern, auf dem nur die Direct3D 11.0-Runtime verwendet wird, wird D3D11CreateDeviceAndSwapChain sofort mit E_INVALIDARG beendet. Verwenden Sie den folgenden Code, um alle möglichen Featureebenen auf einem Computer mit der DirectX 11.0- oder DirectX 11.1-Runtime sicher anzufordern:

              
              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;

 

Erstellen Sie eine Renderzielansicht, indem Sie ID3D11Device::CreateRenderTargetView aufrufen, und binden Sie den Backpuffer als Renderziel, indem Sie ID3D11DeviceContext::OMSetRenderTargets aufrufen.

              
              ID3D11Texture2D* pBackBuffer;

Abrufen eines Zeigers auf den Backpuffer hr = g_pSwapChain-GetBuffer>( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );

Erstellen Sie eine Renderzielansicht g_pd3dDevice-CreateRenderTargetView>( pBackBuffer, NULL, &g_pRenderTargetView );

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

Erstellen Sie einen Viewport, um zu definieren, welche Teile des Renderziels sichtbar sind. Definieren Sie den Viewport mithilfe der D3D11_VIEWPORT-Struktur , und legen Sie den Viewport mithilfe der ID3D11DeviceContext::RSSetViewports-Methode fest.

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 );

Geräte

Verwenden von Direct3D 11

> >   > >   >