본문 바로가기
::public/윈도우즈 응용 프로그래밍

Direct2D - 렌더타겟

by 해맑은욱 2019. 9. 26.

*렌더타겟(render target)

;장면을 그리기 위한 자원들을 생성하고 그리기 연산들을 수행하는 추상화된 핵심 자원.

ID2D1RenderTarget을 상속한 자원으로 표현.

ID2D1HwndRenderTarget: D2D의 대표적인 타입.

ID2D1DCRenderTarget: 한 GDI 장치 컨텍스트에 렌더하는 타입.

 

*그리기 명령

;획(stroke), 채우기(fill)

대부분 첫 번째 인자로 하나의 기본도형(primitive)나 기하(geometry). 두 번째 인자는 하나의 붓(bruch).

D2D의 렌더링에 있어서 좌표계는 왼손 좌표계를 사용함. +x축: 오른쪽 방향, +y축: 아래쪽 방향.

그리기 함수들 외에도 클리핑, 불투명 마스크(opacity mask) 적용, 좌표 공간 변환 등의 함수들을 제공.

 

*일괄처리로 동작하는 그리기 함수

;D2D에서 제공하는 모든 그리기 함수들은 일괄처리 함수. 모든 그리기 함수들은 한번에 처리됨.

// 모든 그리기 함수들은 BeginDraw() ~ EndDraw() 사이에 호출되어야 함.
pRenderTarget->BeginDraw();
//
// 모든 그리기 함수 호출..DrawXxx() or FillXxx()
//
HRESULT hr = pRenderTarget->EndDraw(); // EndDraw 함수 호출 시 일괄처리 시작.
cs

 

*렌더타겟 생성

D2D1_RENDER_TARGET_PROPERTIES

D2D1_HWND_RENDER_TARGET_PROPERTIES

// 지정한 윈도우의 클라이언트 영역에 그림을 그리기 위한 Render Target을 생성.
gp_factory->CreateHwndRenderTarget(
        RenderTargetProperties(),    // 1.
        HwndRenderTargetProperties(hWnd, SizeU(r.right, r.bottom)),    // 2.
        &gp_render_target);
 
// 1. D2D1_RENDER_TARGET_PROPERTIES
typedef struct D2D1_RENDER_TARGET_PROPERTIES
{
    D2D1_RENDER_TARGET_TYPE     type;            // DEFAULT, SOFTWARE, HARDWARE
   D2D1_PIXEL_FORMAT           pixelFormat;    // 렌더타겟의 픽셀 포멧을 명시.
   FLOAT                       dpiX;            // 렌더타겟의 수평 DPI 명시.
   FLOAT                       dpiY;            // 렌더타겟의 수직 DPI 명시.
   D2D1_RENDER_TARGET_USAGE    sage;            // NONE, FORCE_BITMAP_REMOTING, GDI_COMPATIBLE
   D2D1_FEATURE_LEVEL          minLevel;        // DEFAULT, 9, 10
 
} D2D1_RENDER_TARGET_PROPERTIES;
 
D2D1_RENDER_TARGET_PROPERTIES RenderTargetProperties(
    D2D1_RENDER_TARGET_TYPE type =  D2D1_RENDER_TARGET_TYPE_DEFAULT,
    _In_ CONST D2D1_PIXEL_FORMAT &pixelFormat = D2D1::PixelFormat(),
    FLOAT dpiX = 0.0,
    FLOAT dpiY = 0.0,
    D2D1_RENDER_TARGET_USAGE usage = D2D1_RENDER_TARGET_USAGE_NONE,
    D2D1_FEATURE_LEVEL  minLevel = D2D1_FEATURE_LEVEL_DEFAULT
)
 
// 2. D2D1_HWND_RENDER_TARGET_PROPERTIES
typedef struct D2D1_HWND_RENDER_TARGET_PROPERTIES
{
    HWND                     hwnd;            // 렌더타겟의 출력을 보낼 윈도우 핸들.
   D2D1_SIZE_U              pixelSize;       // 렌더타겟의 필셀 단위의 크기.
   D2D1_PRESENT_OPTIONS     presentOptions;  // EndDraw 함수 호출 시에 사용될 DP버퍼가 직전의 내용을 유지할지 여부.
                                            // NONE, RETAIN_CONTENTS, IMMEDIATELY
 
} D2D1_HWND_RENDER_TARGET_PROPERTIES;
 
D2D1_HWND_RENDER_TARGET_PROPERTIES HwndRenderTargetProperties(
    _In_ HWND hwnd,
    _In_ D2D1_SIZE_U pixelSize = D2D1::Size(static_cast<UINT32>(0), static_cast<UINT32>(0)),
    _In_ D2D1_PRESENT_OPTIONS presentOptions = D2D1_PRESENT_OPTIONS_NONE
)
cs

 

*픽셀 포맷

;렌더타겟을 생성할 때에 픽셀 포맷을 명시해야 함. D2D1_PIXEL_FORMAT.

D2D1_PIXEL_FORMAT PixelFormat(
    _In_ DXGI_FORMAT dxgiFormat = DXGI_FORMAT_UNKNOWN,            // 각 픽셀 포맷을 명시.
    _In_ D2D1_ALPHA_MODE alphaMode = D2D1_ALPHA_MODE_UNKNOWN    // 알파 정보의 해석 방법을 명시.
)
cs

*자원

;D2D API의 최상위에 있는 인터페이스로 팩토리 객체인 ID2D1FactoryID2D1Resource 가 있음.

D2D1Factory를 제외한 모든 객체들은 ID2D1Resource 인터페이스를 상속하여 구현되어 있음.

-장치 독립적 자원

;CPU에서 관리하는 자원으로 항상 CPU에 상주함. 렌더링 하드웨어와 연관 없음. GPU의 사용과 무관.

ID2D1DrawingStateBlock
ID2D1Factory
ID2D1Geometry 및 이를 상속한 인터페이스들
ID2D1GeometrySink 및 ID2D1SimplifiedGeometrySink
ID2D1StrokeStyle
cs

-장치 의존적 자원

;특정한 렌더링 장치와 연관되어 있는 자원. 하드웨어 가속이 가능한 경우는 GPU를 의미 그 외는 CPU를 의미.

ID2D1Brush와 이를 상속한 것들
ID2D1Layer
ID2D1RenderTarget와 이를 상속한 것들
cs

*자원의 생성

 

// Direct2D를 구성하는 각종 객체를 생성하는 객체
ID2D1Factory* gp_factory;
// Direct2D에서 윈도우의 클라이언트 영역에 그림을 그릴 객체
ID2D1HwndRenderTarget* gp_render_target;
 
RECT r;
GetClientRect(hWnd, &r);
 
// 지정한 윈도우의 클라이언트 영역에 그림을 그리기 위한 Render Target을 생성.
gp_factory->CreateHwndRenderTarget(
    RenderTargetProperties(),
    HwndRenderTargetProperties(hWnd, SizeU(r.right, r.bottom)),
    &gp_render_target
);
cs

'::public > 윈도우즈 응용 프로그래밍' 카테고리의 다른 글

Direct2D - 기하  (0) 2019.09.26
Direct2D - 변환  (0) 2019.09.26
Direct2D - 그림파일 읽고 출력  (0) 2019.09.25
Direct2D - 오목 만들기  (0) 2019.09.25
Direct2D 사용하기  (0) 2019.09.25