ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Direct2D] ID2D1Effect 사용하기
    C++/미분류 2024. 4. 5. 15:15

    이전 글에서, Render target을 Device context로 변경해보았습니다.

    Device context 사용하기 (ID2D1DeviceContext)

    이전 글에서 소개한 Device context를 사용했을 때의 장점으로 D2D Effect객체를 이용할 수 있다는 점이 있었습니다.

    D2D Effect객체는 이미지를 여러 방법으로 처리할 수 있는 객체입니다.

    이번 글에서는 D2D Effect객체를 생성하고, 출력하는 등의 기본적인 구성에 대해 알아보도록 하겠습니다.

     


     

    0. 제공되는 효과

     

    더보기

    D2D Effect를 통해 적용할 수 있는 효과 중 일부는 다음과 같습니다

    • 색조 변경 (톤 변경, RGB 변환 등)
    • 흐림 효과 (가우시안 블러 등)
    • 변환 (아핀 변환, 자르기, 회전 등)
    • 크로마 키

    이는 제공되는 효과 중 일부분으로, 제공되는 효과에 의 목록은 MSDN에서 소개되고 있습니다.

    Built-in Effects -Win32 apps | Microsoft Learn


    또한, 해당 객체는 라이브러리를 추가해야 합니다.

    d2d1.lib, dxguid.lib를 의존성에 추가해주세요.

     

    해당 객체들은 아래 헤더에 있습니다.

    #include <d2d1effects.h>

    일부 Effect의 경우 d2d1effects_1, _2등의 이후 버전에 있습니다.

    사용하려는 Effect에 맞는 헤더를 추가해주세요.

     

    1. D2D Effect객체 생성

     

    더보기

    D2D Effect객체는 다음과 같이 선언하고, 초기화 할 수 있습니다.

    ComPtr<ID2D1DeviceContext> myDirect2dContext;
    // ...
    ComPtr<ID2D1Effect> affineTransformEffect;
    myDirect2dContext->CreateEffect(
        CLSID_D2D12DAffineTransform,
        &affineTransformEffect
    );

    D2D Device context의 초기화 함수를 이용해서 D2D Effect를 초기화 할 수 있습니다.

    이 때, 사용하려는 Effect에 해당하는 GUID를 첫 번째 파라미터로 전달해야 합니다.

    이번 글에서는 아핀 변환을 예시로 글을 작성했습니다.

     

    생성한 Effect를 이미지에 적용시키는 코드는 다음과 같습니다.

    ComPtr<ID2D1Bitmap> image;
    // ...
    affineTransformEffect->SetInput(0, image.Get());

     

    코드상으로는 Effect에 이미지를 넣는 느낌입니다.

    출력 또한 이미지를 출력하는 것이 아닌, Effect를 출력하는 형태가 되므로, 기존 이미지에는 변화가 없습니다.

     

    2. D2D Effect 효과 적용하기

     

    더보기

    생성된 D2D Effect는 그 자체로는 지정한 효과가 적용되지 않습니다.

    지정한 효과에 대한 구체적인 값을 명시해야 효과가 적용되며, 그 방법은 다음과 같습니다.

    myD2dEffect->SetValue({Id}, {Value});

    지정한 ID와, 지정할 값을 SetValue함수의 파라미터로 전달합니다.

     

    이전 문단의 아핀 변환의 경우, 다음과 같습니다.

    affineTransformEffect->SetValue(                 
        D2D1_2DAFFINETRANSFORM_PROP_TRANSFORM_MATRIX, 
        D2D1::Matrix3x2F::Scale(D2D1::SizeF(0.5f, 0.5f), D2D1::Point2F(0.f, 0.f))
    );

    위 코드는 생성한 아핀 변환 객체에 0.5배의 크기 변환을 적용하는 코드입니다.

    적용하려는 효과마다 여러 종류의 효과 속성이 있으므로, 문서를 찾아보시는 것을 권장합니다. 

     

    3. D2D Effect 출력하기

     

    더보기

    D2D Effect의 출력은 다음과 같이 할 수 있습니다.

    myDirect2dContext->BeginDraw();
    myDirect2dContext->DrawImage(affineTransformEffect.Get();
    myDirect2dContext->EndDraw();

    비트맵 및 다른 출력과 동일하게, BeginDraw함수 호출 이후, EndDraw함수 호출 이전에 DrawImage함수를 호출, 출력할 효과를 전달하는 것으로 출력할 수 있습니다.

     

    DrawImage함수는 몇 가지의 오버로딩이 있습니다.

    myDirect2dContext->DrawImage(
        {ID2D1Effect}*,
        {D2D1_POINT_2F}*,
        {D2D1_RECT_F}*,
        {D2D1_INTERPOLATION_MODE}*,
        {D2D1_COMPOSITE_MODE}*
    );

    각각의 파라미터는 다음과 같습니다.

    • ID2D1Effect : 출력하는 대상 효과입니다.
    • D2D1_POINT_2F : 출력에 적용할 오프셋입니다. 지정한 값 만큼 출력 위치가 이동됩니다.
    • D2D1_RECT_F : 출력할 공간의 크기입니다. 지정한 크기만큼만 출력합니다.
    • D2D1_INTERPOLATION_MODE : 출력에 적용할 보간 모드입니다.
    • D2D1_COMPOSITE_MODE : 출력에 적용할 혼합 모드입니다.

    ID2D1Effect외의 모든 값은 기본 값이 존재합니다.

    따라서, 추가적인 설정이 불필요할 경우 ID2D1Effect객체만 전달하는 것으로 출력이 가능합니다.

    다른 값의 경우, 상황에 적절한 값을 사용해주세요.

    D2D1_INTERPOLATION_MODED2D1_COMPOSITE_MODE 의 값은 다음 MSDN에 기술되어 있습니다.

    D2D1_INTERPOLATION_MODE (d2d1_1.h) - Win32 apps | Microsoft Learn
    D2D1_COMPOSITE_MODE (d2d1_1.h) - Win32 apps | Microsoft Learn

     

     

    4. D2D Effect 혼합하기

     

    더보기

    이전 문단에서, 아래와 같이 D2D Effect에 이미지를 지정했습니다.

    affineTransformEffect->SetInput(0, image.Get());

     

    위 코드는 한 이미지에 한 효과를 적용시킬 수 있는 코드로, 한 이미지에 여러 종류의 효과를 적용시키는 것은 다른 방법이 필요합니다.

    D2D Effect는 여러 효과를 중첩시킬 수 있는 기능을 제공합니다.

    affineTransformEffect->SetInputEffect(0, chromakeyEffect.Get());

    D2D Effect의 SetInputEffect함수는 Effect에 Effect를 전달할 수 있는 함수입니다.

    위 아핀 변환 효과에 전달한 객체는 chromakeyEffect로, 크로마 키 효과를 만드는 객체입니다.

    위와 같이 아핀 변환에 크로마 키 효과를 적용한 객체를 그리게 될 경우, 두 효과가 동시에 적용된 이미지가 출력됩니다.

     


     

    MSDN에 소개한 효과들은 그 종류가 굉장히 많습니다.

    각각의 효과는 전달하는 값에 대한 수치와 열거형이 다를 뿐, 사용하는 함수와 방법 등은 유사하므로, 문서를 따라 원하시는 효과를 적용하는 데 무리가 없을 것 입니다.

     

    이번 글이 도움이 되셨기를 바랍니다.

    감사합니다.

    댓글

Designed by Tistory.