다음을 통해 공유


Direct2D로 그리기

그래픽 리소스를 만들고 나면 그릴 준비가 된 것입니다.

타원 그리기

프로그램은 매우 간단한 그리기 논리를 수행합니다.

  1. 배경색을 단색으로 채웁니다.
  2. 채워진 원을 그립니다.

원 프로그램의 스크린샷

렌더링 대상이 비트맵이나 다른 오프스크린 표면이 아닌 창이기 때문에 WM_PAINT 메시지에 대한 응답으로 그리기가 수행됩니다. 다음 코드는 원 프로그램의 창 프로시저를 보여 줍니다.

LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_PAINT:
            OnPaint();
            return 0;

         // Other messages not shown...
    }
    return DefWindowProc(m_hwnd, uMsg, wParam, lParam);
}

다음은 원을 그리는 코드입니다.

void MainWindow::OnPaint()
{
    HRESULT hr = CreateGraphicsResources();
    if (SUCCEEDED(hr))
    {
        PAINTSTRUCT ps;
        BeginPaint(m_hwnd, &ps);
     
        pRenderTarget->BeginDraw();

        pRenderTarget->Clear( D2D1::ColorF(D2D1::ColorF::SkyBlue) );
        pRenderTarget->FillEllipse(ellipse, pBrush);

        hr = pRenderTarget->EndDraw();
        if (FAILED(hr) || hr == D2DERR_RECREATE_TARGET)
        {
            DiscardGraphicsResources();
        }
        EndPaint(m_hwnd, &ps);
    }
}

ID2D1RenderTarget 인터페이스는 모든 그리기 작업에 사용됩니다. 프로그램의 OnPaint 메서드는 다음 작업을 수행합니다.

  1. ID2D1RenderTarget::BeginDraw 메서드는 그리기 시작을 알립니다.
  2. ID2D1RenderTarget::Clear 메서드는 전체 렌더링 대상을 단색으로 채웁니다. 색은 D2D1_COLOR_F 구조체로 지정됩니다. D2D1::ColorF 클래스를 사용하여 구조체를 초기화할 수 있습니다. 자세한 내용은 Direct2D에서 색 사용을 참조하세요.
  3. ID2D1RenderTarget::FillEllipse 메서드는 채우기에 지정된 브러시를 사용하여 채워진 타원을 그립니다. 타원은 중심점과 x 및 y 반지름으로 지정됩니다. x와 y 반지름이 같으면 결과는 원이 됩니다.
  4. ID2D1RenderTarget::EndDraw 메서드는 이 프레임에 대한 그리기 완료를 알립니다. 모든 그리기 작업은 BeginDrawEndDraw 사이에 배치되어야 합니다.

BeginDraw, ClearFillEllipse 메서드는 모두 반환 형식이 void입니다. 이러한 메서드를 실행하는 동안 오류가 발생하면 EndDraw 메서드의 반환 값을 통해 오류 알림이 표시됩니다. CreateGraphicsResources 메서드는 Direct2D 리소스 만들기 항목에 설명되어 있습니다. 이 메서드는 렌더링 대상 및 단색 브러시를 만듭니다.

디바이스는 그리기 명령을 버퍼링하고 EndDraw 가 호출될 때까지 실행을 연기할 수 있습니다. ID2D1RenderTarget::Flush를 호출하여 디바이스에서 보류 중인 그리기 명령을 강제로 실행할 수 있습니다. 그러나 플러시하면 성능이 저하됩니다.

디바이스 손실 처리

프로그램이 실행되는 동안 사용 중인 그래픽 디바이스를 사용할 수 없게 될 수 있습니다. 예를 들어 디스플레이 해상도가 변경되거나 사용자가 디스플레이 어댑터를 제거하는 경우 디바이스가 손실될 수 있습니다. 디바이스가 손실되면 디바이스에 연결된 디바이스 종속 리소스와 함께 렌더링 대상도 유효하지 않게 됩니다. Direct2D는 EndDraw 메서드에서 D2DERR_RECREATE_TARGET 오류 코드를 반환하여 손실된 디바이스에 신호를 보냅니다. 이 오류 코드가 표시되면 렌더링 대상과 모든 디바이스 종속 리소스를 다시 만들어야 합니다.

리소스를 삭제하려면 해당 리소스에 대한 인터페이스를 해제하기만 하면 됩니다.

void MainWindow::DiscardGraphicsResources()
{
    SafeRelease(&pRenderTarget);
    SafeRelease(&pBrush);
}

리소스를 만드는 작업은 비용이 많이 들 수 있으므로 모든 WM_PAINT 메시지에 대해 리소스를 다시 만들지 마세요. 리소스를 한 번 만들고 디바이스 손실로 인해 리소스가 유효하지 않게 되거나 해당 리소스가 더 이상 필요하지 않을 때까지 리소스 포인터를 캐시하세요.

Direct2D 렌더링 루프

무엇을 그리는지에 관계없이 프로그램은 다음과 같은 루프를 수행해야 합니다.

  1. 디바이스 독립적 리소스를 만듭니다.
  2. 장면을 렌더링합니다.
    1. 유효한 렌더링 대상이 있는지 확인합니다. 없으면 렌더링 대상 및 디바이스 종속 리소스를 만듭니다.
    2. ID2D1RenderTarget::BeginDraw를 호출합니다.
    3. 그리기 명령을 실행합니다.
    4. ID2D1RenderTarget::EndDraw를 호출합니다.
    5. EndDrawD2DERR_RECREATE_TARGET을 반환하는 경우 렌더링 대상 및 디바이스 종속 리소스를 삭제합니다.
  3. 장면을 업데이트하거나 다시 그려야 할 때마다 2단계를 반복합니다.

렌더링 대상이 창인 경우 창이 WM_PAINT 메시지를 받을 때마다 2단계가 수행됩니다.

여기에 표시된 루프는 디바이스 종속 리소스를 삭제하고 다음 루프 시작 시 다시 만들어(2a단계) 디바이스 손실을 처리합니다.

다음

DPI와 디바이스 독립적 픽셀