방법: 디바이스 및 즉각적인 컨텍스트 만들기

이 항목에서는 디바이스를 초기화하는 방법을 보여 줍니다. 디바이스 초기화는 장면을 렌더링하기 전에 애플리케이션이 완료해야 하는 첫 번째 작업 중 하나입니다.

디바이스 및 즉각적인 컨텍스트를 만들려면

버퍼 형식 및 차원에 대한 정보로 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;

1단계의 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;
}

참고 항목

Direct3D 11.0 런타임만 있는 컴퓨터에서 D3D_FEATURE_LEVEL_11_1 디바이스를 요청하는 경우 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* device = nullptr; HRESULT hr = D3D11CreateDeviceAndSwapChain( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, lvl, _countof(lvl), D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3ddevice, &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, 및 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을 사용하는 방법

> >   > >   >