다음을 통해 공유


렌더링 대상 개요

렌더링 대상은 ID2D1RenderTarget 인터페이스에서 상속되는 리소스입니다. 렌더링 대상은 그리기 위한 리소스를 만들고 실제 그리기 작업을 수행합니다. 이 항목에서는 다양한 유형의 Direct2D 렌더링 대상과 대상을 사용하는 방법에 대해 설명합니다.

렌더링 대상

렌더링 대상은 ID2D1RenderTarget 인터페이스에서 상속되는 리소스입니다. 렌더링 대상은 그리기 위한 리소스를 만들고 실제 그리기 작업을 수행합니다. 다음과 같은 방법으로 그래픽을 렌더링하는 데 사용할 수 있는 여러 종류의 렌더링 대상이 있습니다.

  • ID2D1HwndRenderTarget 개체는 콘텐츠를 창에 렌더링합니다.
  • ID2D1DCRenderTarget 개체는 GDI 디바이스 컨텍스트에 렌더링됩니다.
  • 비트맵 렌더링 대상 개체는 오프스크립 비트맵에 콘텐츠를 렌더링합니다.
  • DXGI 렌더링 대상 개체는 Direct3D와 함께 사용하기 위해 DXGI 화면에 렌더링됩니다.

렌더링 대상은 특정 렌더링 디바이스와 연결되므로 디바이스 종속 리소스이며 디바이스가 제거되면 작동이 중단됩니다.

렌더링 대상 기능

렌더링 대상이 하드웨어 가속을 사용하는지 여부와 원격 디스플레이가 로컬 또는 원격 컴퓨터에서 렌더링되는지 여부를 지정할 수 있습니다. 렌더링 대상은 별칭 또는 앤티앨리어싱된 렌더링에 대해 설정할 수 있습니다. 많은 수의 기본 형식이 있는 렌더링 장면의 경우 개발자는 별칭이 지정된 모드에서 2차원 그래픽을 렌더링하고 D3D 멀티샘플 앤티앨리어싱을 사용하여 확장성을 향상할 수도 있습니다.

렌더링 대상은 그리기 작업을 ID2D1Layer 인터페이스가 나타내는 레이어로 그룹화할 수도 있습니다. 레이어는 프레임을 렌더링할 때 함께 합성할 그리기 작업을 수집하는 데 유용합니다. 일부 시나리오에서는 계층화에 대한 할당 비용이 ID2D1BitmapRenderTarget보다 낮기 때문에 비트맵 렌더링 대상에 렌더링한 다음 비트맵 콘텐츠를 다시 사용하는 데 유용한 대안이 될 수 있습니다.

렌더링 대상은 자체와 호환되는 새 렌더링 대상을 만들 수 있으며, 이는 원본에 설정된 다양한 렌더링 대상 속성을 유지하면서 중간 화면 외부 렌더링에 유용합니다.

GDI 디바이스 컨텍스트를 검색하는 데 사용할 수 있는 GetDCReleaseDC 메서드가 있는 ID2D1GdiInteropRenderTarget의 렌더링 대상에서 QueryInterface를 호출하여 Direct2D 렌더링 대상에서 GDI를 사용하여 렌더링할 수도 있습니다. GDI를 통한 렌더링은 D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE 플래그 집합을 사용하여 렌더링 대상을 만든 경우에만 가능합니다. 이는 주로 Direct2D로 렌더링되지만 확장성 모델 또는 GDI를 사용하여 렌더링하는 기능이 필요한 기타 레거시 콘텐츠가 있는 애플리케이션에 유용합니다. 자세한 내용은 Direct2D 및 GDI 상호 운용 개요를 참조하세요.

대상 리소스 렌더링

팩터리처럼 렌더링 대상은 그리기 리소스를 만들 수 있습니다. 렌더링 대상에서 만든 모든 리소스는 렌더링 대상과 마찬가지로 디바이스 종속 리소스입니다. 렌더링 대상은 다음과 같은 유형의 리소스를 만들 수 있습니다.

  • 비트맵
  • 브러시
  • 계층
  • 메시

그리기 명령

콘텐츠를 렌더링하려면 렌더링 대상 그리기 메서드를 사용합니다. 그리기를 시작하기 전에 ID2D1RenderTarget::BeginDraw 메서드를 호출합니다. 그리기를 완료한 후 ID2D1RenderTarget::EndDraw 메서드를 호출합니다. 이러한 호출 사이에 그리기 및 채우기 메서드를 사용하여 그리기 리소스를 렌더링합니다. 대부분의 그리기 및 채우기 메서드는 셰이프(기본형 또는 기하 도형)와 도형을 채우거나 윤곽을 그리기 위한 브러시를 사용합니다.

렌더링 대상은 클리핑, 불투명 마스크 적용 및 좌표 공간 변환을 위한 메서드를 제공합니다.

Direct2D는 왼손 좌표계를 사용합니다. 양수 x축 값은 오른쪽으로, 양수 y축 값은 아래쪽으로 진행됩니다.

오류 처리

렌더링 대상 그리기 명령은 요청된 작업이 성공했는지 여부를 나타내지 않습니다. 그리기 오류가 있는지 확인하려면 렌더링 대상 Flush 메서드 또는 EndDraw 메서드를 호출하여 HRESULT를 가져옵니다.

예: 창에 콘텐츠 렌더링

다음 예제에서는 CreateHwndRenderTarget 메서드를 사용하여 ID2D1HwndRenderTarget을 만듭니다.

RECT rc;
GetClientRect(m_hwnd, &rc);

D2D1_SIZE_U size = D2D1::SizeU(
    rc.right - rc.left,
    rc.bottom - rc.top
    );

// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(),
    D2D1::HwndRenderTargetProperties(m_hwnd, size),
    &m_pRenderTarget
    );

다음 예제에서는 ID2D1HwndRenderTarget 을 사용하여 창에 텍스트를 그립니다.

//  Called whenever the application needs to display the client
//  window. This method writes "Hello, World"
//
//  Note that this function will automatically discard device-specific
//  resources if the Direct3D device disappears during function
//  invocation, and will recreate the resources the next time it's
//  invoked.
//
HRESULT DemoApp::OnRender()
{
    HRESULT hr;

    hr = CreateDeviceResources();

    if (SUCCEEDED(hr))
    {
        static const WCHAR sc_helloWorld[] = L"Hello, World!";

        // Retrieve the size of the render target.
        D2D1_SIZE_F renderTargetSize = m_pRenderTarget->GetSize();

        m_pRenderTarget->BeginDraw();

        m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());

        m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

        m_pRenderTarget->DrawText(
            sc_helloWorld,
            ARRAYSIZE(sc_helloWorld) - 1,
            m_pTextFormat,
            D2D1::RectF(0, 0, renderTargetSize.width, renderTargetSize.height),
            m_pBlackBrush
            );

        hr = m_pRenderTarget->EndDraw();

        if (hr == D2DERR_RECREATE_TARGET)
        {
            hr = S_OK;
            DiscardDeviceResources();
        }
    }

    return hr;
}

이 예제에서는 코드를 생략합니다.