Partager via


Procédure : créer un appareil et un contexte immédiat

Cette rubrique montre comment initialiser un appareil. L’initialisation d’un appareil est l’une des premières tâches que votre application doit effectuer avant de pouvoir afficher votre scène.

Pour créer un appareil et un contexte immédiat

Renseignez la structure DXGI_SWAP_CHAIN_DESC avec des informations sur les formats et les dimensions de la mémoire tampon. Pour plus d’informations, consultez Création d’une chaîne d’échange.

L’exemple de code suivant montre comment remplir la structure 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;

À l’aide de la structure DXGI_SWAP_CHAIN_DESC de l’étape 1, appelez D3D11CreateDeviceAndSwapChain pour initialiser l’appareil et permuter la chaîne en même temps.

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

Notes

Si vous demandez un appareil D3D_FEATURE_LEVEL_11_1 sur un ordinateur avec uniquement le runtime Direct3D 11.0, D3D11CreateDeviceAndSwapChain se ferme immédiatement avec E_INVALIDARG. Pour demander en toute sécurité tous les niveaux de fonctionnalités possibles sur un ordinateur avec le runtime DirectX 11.0 ou DirectX 11.1, utilisez ce 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;

 

Créez une vue de cible de rendu en appelant ID3D11Device::CreateRenderTargetView et liez l’arrière-mémoire tampon en tant que cible de rendu en appelant ID3D11DeviceContext::OMSetRenderTargets.

              
              ID3D11Texture2D* pBackBuffer;

Obtenir un pointeur vers la mémoire tampon d’arrière-plan hr = g_pSwapChain-GetBuffer>( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer);

Créer une vue de cible de rendu g_pd3dDevice-CreateRenderTargetView>( pBackBuffer, NULL, &g_pRenderTargetView);

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

Créez une fenêtre d’affichage pour définir les parties de la cible de rendu qui seront visibles. Définissez la fenêtre d’affichage à l’aide de la structure D3D11_VIEWPORT et définissez la fenêtre d’affichage à l’aide de la méthode 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 );

Appareils

Utilisation de Direct3D 11

> >   > >   >