렌더링 대상 개요
렌더링 대상은 ID2D1RenderTarget 인터페이스에서 상속되는 리소스입니다. 렌더링 대상은 그리기 위한 리소스를 만들고 실제 그리기 작업을 수행합니다. 이 항목에서는 다양한 유형의 Direct2D 렌더링 대상과 대상을 사용하는 방법에 대해 설명합니다.
- 렌더링 대상
- 렌더 타겟 기능
- 렌더링 대상 리소스
- 그리기 명령
- 오류 처리
- 예제: 창에 콘텐츠 렌더링
렌더링 대상
렌더링 대상은 ID2D1RenderTarget 인터페이스에서 상속되는 리소스입니다. 렌더링 대상은 그리기 위한 리소스를 만들고 실제 그리기 작업을 수행합니다. 다음과 같은 방법으로 그래픽을 렌더링하는 데 사용할 수 있는 여러 종류의 렌더링 대상이 있습니다.
- ID2D1HwndRenderTarget 개체는 콘텐츠를 창에 렌더링합니다.
- ID2D1DCRenderTarget 개체는 GDI 디바이스 컨텍스트에 렌더링됩니다.
- 비트맵 렌더링 대상 개체는 오프스크립 비트맵에 콘텐츠를 렌더링합니다.
- DXGI 렌더링 대상 개체는 Direct3D와 함께 사용하기 위해 DXGI 화면에 렌더링됩니다.
렌더링 대상은 특정 렌더링 디바이스와 연결되므로 디바이스 종속 리소스이며 디바이스가 제거되면 작동이 중단됩니다.
렌더링 대상 기능
렌더링 대상에서 하드웨어 가속을 사용하는지 여부와 로컬 컴퓨터 또는 원격 컴퓨터에서 원격 디스플레이를 렌더링할지 여부를 지정할 수 있습니다. 렌더링 대상은 별칭 또는 앤티앨리어싱된 렌더링을 위해 설정할 수 있습니다. 개발자는 기본 형식이 많은 장면을 렌더링하기 위해 별칭 모드로 2차원 그래픽을 렌더링하고 D3D 다중 샘플링 앤티앨리어싱을 사용하여 확장성을 향상할 수도 있습니다.
렌더링 대상은 그리기 작업을 ID2D1Layer 인터페이스가 나타내는 레이어로 그룹화할 수도 있습니다. 레이어는 프레임을 렌더링할 때 함께 합성할 그리기 작업을 수집하는 데 유용합니다. 일부 시나리오에서는 계층화에 대한 할당 비용이 ID2D1BitmapRenderTarget비해 낮기 때문에 비트맵 렌더링 대상에 렌더링한 다음 비트맵 콘텐츠를 다시 사용하는 데 유용한 대안이 될 수 있습니다.
렌더링 대상은 자체와 호환되는 새 렌더링 대상을 만들 수 있으며, 이는 원본에 설정된 다양한 렌더링 대상 속성을 유지하면서 중간 오프스크립션 렌더링에 유용합니다.
또한 ID2D1GdiInteropRenderTarget대한 렌더링 대상에서 QueryInterface 호출하여 Direct2D 렌더링 대상에서 GDI를 사용하여 렌더링할 수 있습니다. 여기에는 GDI 디바이스 컨텍스트를 검색하는 데 사용할 수 있는 GetDC 및 ReleaseDC 메서드가 있습니다. 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;
}
이 예제에서 코드를 생략했습니다.