How To: Erstellen eines Geräts und sofortigen Kontexts

In diesen Themen wird gezeigt, wie ein Gerät initialisiert wird. Die Initialisierung 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 Austauschkette.

Im folgenden Codebeispiel wird veranschaulicht, wie sie die DXGI _ SWAP CHAIN _ _ DESC-Struktur ausfüllen.

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 Austauschkette 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 nur mit der Direct3D 11.0-Runtime anfordern, wird D3D11CreateDeviceAndSwapChain sofort mit E _ INVALIDARG beendet. Um alle möglichen Featureebenen auf einem Computer mit der DirectX 11.0- oder DirectX 11.1-Runtime sicher an fordern zu können, verwenden Sie diesen Code:

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 den Backpuffer als Renderziel binden, indem Sie ID3D11DeviceContext::OMSetRenderTargets aufrufen.

ID3D11Texture2D* pBackBuffer;

// Get a pointer to the back buffer hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );

// Create a render-target view 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 _ VIEWPORT-Struktur D3D11, 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

> > > > >