Cara: Membuat Perangkat dan Konteks Langsung

Topik ini menunjukkan cara menginisialisasi perangkat. Menginisialisasi perangkat adalah salah satu tugas pertama yang harus diselesaikan aplikasi Anda sebelum Anda dapat merender adegan Anda.

Untuk membuat perangkat dan konteks langsung

Isi struktur DXGI_SWAP_CHAIN_DESC dengan informasi tentang format dan dimensi buffer. Untuk informasi selengkapnya, lihat Membuat Swap Chain.

Contoh kode berikut menunjukkan cara mengisi struktur 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;

Dengan menggunakan struktur DXGI_SWAP_CHAIN_DESC dari langkah pertama, panggil D3D11CreateDeviceAndSwapChain untuk menginisialisasi perangkat dan rantai pertukaran secara bersamaan.

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

Catatan

Jika Anda meminta perangkat D3D_FEATURE_LEVEL_11_1 di komputer dengan hanya runtime Direct3D 11.0, D3D11CreateDeviceAndSwapChain segera keluar dengan E_INVALIDARG. Untuk meminta semua tingkat fitur yang mungkin di komputer dengan runtime DirectX 11.0 atau DirectX 11.1 dengan aman, gunakan kode ini:

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

PERANGKAT ID3D11Device* = 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;

 

Buat tampilan target render dengan memanggil ID3D11Device::CreateRenderTargetView dan ikat back-buffer sebagai target render dengan memanggil ID3D11DeviceContext::OMSetRenderTargets.

ID3D11Texture2D* pBackBuffer; 

Dapatkan pointer ke hr buffer belakang = g_pSwapChain-GetBuffer>( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );

Buat tampilan target render g_pd3dDevice-CreateRenderTargetView>( pBackBuffer, NULL, &g_pRenderTargetView );

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

Buat viewport untuk menentukan bagian mana dari target render yang akan terlihat. Tentukan viewport menggunakan struktur D3D11_VIEWPORT dan atur viewport menggunakan metode 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 );

Perangkat

Cara Menggunakan Direct3D 11

> >   > >   >