컴퓨터 그래픽스/DirectX

Tutorial02 코드 분석2

san10 2023. 5. 26. 22:18
// Create a render target view
    ID3D11Texture2D* pBackBuffer = nullptr;
    hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), reinterpret_cast<void**>( &pBackBuffer ) );
    if( FAILED( hr ) )
        return hr;

    hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, nullptr, &g_pRenderTargetView );
    pBackBuffer->Release();
    if( FAILED( hr ) )
        return hr;

    g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, nullptr );

이 부분은 렌더 타겟 뷰를 생성하는 부분이다.

DIrect3D에서 텍스처를 사용하려면 텍스처의 초기화 시점에서 텍스처의 자원 뷰를 생성해야한다.

지금은 텍스처를 렌더 대상으로 사용하기에 렌더 타겟뷰를 생성한다.

 

이러한 자원 뷰들은 크게 두가지 역할을 하는데,

하나는 Direct3D의 어느 파이프라인에 묶을지 알려주고,

또 하나는 자원 형식의 구체적인 형식을 결정해야한다.

 

후면 버퍼를 파이프라인의 출력 병합기 단계에서 묶기 위해서는,

우선 후면 버퍼에 대한 렌더 타겟뷰를 생성해야한다.

 

이 코드에서는 GetBuffer를 통해 후면 버퍼에 대한 포인터를 얻어오는데,

첫번째 매개변수는 후면 버퍼의 인덱스이다.

(지금은 후면 버퍼를 하나만 쓰기에 0)

두번째는 버퍼의 인터페이스 형식을 지정하고,

세번째 매개변수에서 후면 버퍼를 가리키는 포인터를 돌려준다.

 

그리고 createRenderTagetView 메서드를 통해 렌더 타겟 뷰를 생성한다.

첫번째 매개변수는 렌더 타겟으로 사용할 자원인데,

지금은 후면 버퍼에 대한 렌더 타겟뷰를 생성할 것이기에 GetBuffer에서 얻은 후면 버퍼를 지정했다. (pBackBuffer)

두번째 매개변수는 D3D11_RENDER_TARGET_VIEW_DESC 구조체를 가리키는 포인터라는데...

형식을 지정해서 자원을 생성했다면 이 매개변수에 null을 지정해도 된다고 한다.

그리고 세번째 매개변수에 생성된 렌더 타겟 뷰를 돌려준다.

 

그리고 OMSetRenderTargets 를 통해 생성한 렌더 타겟 뷰를 파이프라인의 출력 병합기에 묶는다.

첫번째 매개변수에는 렌더 타겟 개수이고,

두번째 매개변수엔 생성한 렌더 타겟 뷰의 포인터,

세번째는 깊이-스텐실 버퍼를 설정한다고 한다.

지금은 깊이-스텐실 버퍼를 생성하지 않기에 null을 넣었다.

 

 

// Setup the viewport
    D3D11_VIEWPORT vp;
    vp.Width = (FLOAT)width;
    vp.Height = (FLOAT)height;
    vp.MinDepth = 0.0f;
    vp.MaxDepth = 1.0f;
    vp.TopLeftX = 0;
    vp.TopLeftY = 0;
    g_pImmediateContext->RSSetViewports( 1, &vp );

뷰포트를 설정하는 부분이다.

뷰포트란, 장면을 그려 놓고자하는 후면 버퍼의 직사각형 영역이다.

여기서 뷰포트의 위치와 크기를 조절할 수 있다.

 

그리고 뷰포트 구조체를 생성한 다음 RSSetViewports 메서드를 통해 Direct3D에 뷰포트를 알려준다.

첫번째 매개변수는 뷰포트 개수이고,

두번째 매개변수는 뷰포트 배열을 가리키는 포인트이다.