다음을 통해 공유


렌더링 대상, 디바이스 및 리소스

‘렌더링 대상’은 프로그램이 그리는 위치에 불과합니다. 일반적으로 렌더링 대상은 창(특히 창의 클라이언트 영역)입니다. 표시되지 않는 메모리의 비트맵일 수도 있습니다. 렌더링 대상은 ID2D1RenderTarget 인터페이스로 표시됩니다.

‘디바이스’는 실제로 픽셀을 그리는 항목을 나타내는 추상화입니다. 하드웨어 디바이스는 더 빠른 성능을 위해 GPU를 사용하는 반면 소프트웨어 디바이스는 CPU를 사용합니다. 애플리케이션에서 디바이스를 만들지는 않습니다. 대신 애플리케이션이 렌더링 대상을 만들 때 디바이스가 암시적으로 만들어집니다. 각 렌더링 대상은 하드웨어 또는 소프트웨어와 같은 특정 디바이스와 연결됩니다.

렌더링 대상과 디바이스 간의 관계를 보여 주는 다이어그램

‘리소스’는 프로그램에서 그리기에 사용하는 개체입니다. 다음은 Direct2D에 정의된 리소스의 몇 가지 예입니다.

  • 브러시 선과 영역을 그리는 방법을 제어합니다. 브러시 유형에는 단색 브러시와 그라데이션 브러시가 포함됩니다.
  • 스트로크 스타일. 선의 모양(예: 파선 또는 실선)을 제어합니다.
  • 기하 도형 선 및 커서 컬렉션을 나타냅니다.
  • 메시. 삼각형에서 만들어진 셰이프입니다. 메시 데이터는 렌더링하기 전에 변환해야 하는 기하 도형 데이터와 달리 GPU에서 직접 사용할 수 있습니다.

렌더링 대상도 리소스 유형으로 간주됩니다.

일부 리소스는 하드웨어 가속의 이점을 누릴 수 있습니다. 이 유형의 리소스는 항상 특정 디바이스(하드웨어(GPU) 또는 소프트웨어(CPU))와 연결됩니다. 이 유형의 리소스를 ‘디바이스 종속’이라고 합니다. 브러시 및 메시는 디바이스 종속 리소스의 예입니다. 디바이스를 사용할 수 없게 되면 새 디바이스에 대해 리소스를 다시 만들어야 합니다.

다른 리소스는 사용되는 디바이스에 관계없이 CPU 메모리에 유지됩니다. 이러한 리소스는 특정 디바이스와 연결되지 않으므로 ‘디바이스 독립’입니다. 디바이스가 변경되면 디바이스 독립 리소스를 다시 만들 필요가 없습니다. 스트로크 스타일 및 기하 도형은 디바이스 독립 리소스입니다.

각 리소스에 대한 Windows 설명서에는 리소스가 디바이스 종속인지 디바이스 독립적인지 여부가 명시되어 있습니다. 모든 리소스 유형은 ID2D1Resource에서 파생되는 인터페이스로 표시됩니다. 예를 들어 브러시는 ID2D1Brush 인터페이스로 표시됩니다.

Direct2D 팩터리 개체

Direct2D를 사용하는 첫 번째 단계는 Direct2D 팩터리 개체의 인스턴스를 만드는 것입니다. 컴퓨터 프로그래밍에서 ‘팩터리’는 다른 개체를 만드는 개체입니다. Direct2D 팩터리는 다음과 같은 유형의 개체를 만듭니다.

  • 렌더링 대상.
  • 스트로크 스타일 및 기하 도형과 같은 디바이스 독립 리소스입니다.

브러시 및 비트맵과 같은 디바이스 종속 리소스는 렌더링 대상 개체에 의해 만들어집니다.

direct2d 팩터리를 보여 주는 다이어그램

Direct2D 팩터리 개체를 만들려면 D2D1CreateFactory 함수를 호출합니다.

ID2D1Factory *pFactory = NULL;

HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);

첫 번째 매개 변수는 만들기 옵션을 지정하는 플래그입니다. D2D1_FACTORY_TYPE_SINGLE_THREADED 플래그는 여러 스레드에서 Direct2D를 호출하지 않음을 의미합니다. 여러 스레드의 호출을 지원하려면 D2D1_FACTORY_TYPE_MULTI_THREADED를 지정합니다. 프로그램에서 단일 스레드를 사용하여 Direct2D로 호출하는 경우에는 단일 스레드 옵션이 더 효율적입니다.

D2D1CreateFactory 함수에 대한 두 번째 매개 변수는 ID2D1Factory 인터페이스에 대한 포인터를 받습니다.

첫 번째 WM_PAINT 메시지 앞에 Direct2D 팩터리 개체를 만들어야 합니다. WM_CREATE 메시지 처리기는 팩터리를 만드는 데 적합합니다.

    case WM_CREATE:
        if (FAILED(D2D1CreateFactory(
                D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory)))
        {
            return -1;  // Fail CreateWindowEx.
        }
        return 0;

Direct2D 리소스 만들기

Circle 프로그램은 다음과 같은 디바이스 종속 리소스를 사용합니다.

  • 애플리케이션 창과 연결된 렌더링 대상
  • 원을 그리는 단색 브러시

이러한 각 리소스는 다음과 같이 COM 인터페이스로 표시됩니다.

Circle 프로그램은 이러한 인터페이스에 대한 포인터를 MainWindow 클래스의 멤버 변수로 저장합니다.

ID2D1HwndRenderTarget   *pRenderTarget;
ID2D1SolidColorBrush    *pBrush;

다음 코드는 이러한 두 리소스를 만듭니다.

HRESULT MainWindow::CreateGraphicsResources()
{
    HRESULT hr = S_OK;
    if (pRenderTarget == NULL)
    {
        RECT rc;
        GetClientRect(m_hwnd, &rc);

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

        hr = pFactory->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(),
            D2D1::HwndRenderTargetProperties(m_hwnd, size),
            &pRenderTarget);

        if (SUCCEEDED(hr))
        {
            const D2D1_COLOR_F color = D2D1::ColorF(1.0f, 1.0f, 0);
            hr = pRenderTarget->CreateSolidColorBrush(color, &pBrush);

            if (SUCCEEDED(hr))
            {
                CalculateLayout();
            }
        }
    }
    return hr;
}

창에 대한 렌더링 대상을 만들려면 Direct2D 팩터리에서 ID2D1Factory::CreateHwndRenderTarget 메서드를 호출합니다.

  • 첫 번째 매개 변수는 모든 유형의 렌더링 대상에 공통적인 옵션을 지정합니다. 여기서는 도우미 함수 D2D1::RenderTargetProperties를 호출하여 기본 옵션을 전달합니다.
  • 두 번째 매개 변수는 창에 대한 핸들과 렌더링 대상의 크기를 픽셀 단위로 지정합니다.
  • 세 번째 매개 변수는 ID2D1HwndRenderTarget 포인터를 수신합니다.

단색 브러시를 만들려면 렌더링 대상에서 ID2D1RenderTarget::CreateSolidColorBrush 메서드를 호출합니다. 색은 D2D1_COLOR_F 값으로 지정됩니다. Direct2D의 색에 대한 자세한 내용은 Direct2D에서 색 사용을 참조하세요.

또한 렌더링 대상이 이미 있는 경우 CreateGraphicsResources 메서드는 아무 작업도 수행하지 않고 S_OK를 반환합니다. 이렇게 디자인하는 이유는 다음 항목에서 명확히 알 수 있습니다.

다음

Direct2D로 그리기