-
[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_MODE 및 D2D1_COMPOSITE_MODE 의 값은 다음 MSDN에 기술되어 있습니다.
D2D1_INTERPOLATION_MODE (d2d1_1.h) - Win32 apps | Microsoft Learn
D2D1_COMPOSITE_MODE (d2d1_1.h) - Win32 apps | Microsoft Learn4. D2D Effect 혼합하기
더보기이전 문단에서, 아래와 같이 D2D Effect에 이미지를 지정했습니다.
affineTransformEffect->SetInput(0, image.Get());
위 코드는 한 이미지에 한 효과를 적용시킬 수 있는 코드로, 한 이미지에 여러 종류의 효과를 적용시키는 것은 다른 방법이 필요합니다.
D2D Effect는 여러 효과를 중첩시킬 수 있는 기능을 제공합니다.
affineTransformEffect->SetInputEffect(0, chromakeyEffect.Get());
D2D Effect의 SetInputEffect함수는 Effect에 Effect를 전달할 수 있는 함수입니다.
위 아핀 변환 효과에 전달한 객체는 chromakeyEffect로, 크로마 키 효과를 만드는 객체입니다.
위와 같이 아핀 변환에 크로마 키 효과를 적용한 객체를 그리게 될 경우, 두 효과가 동시에 적용된 이미지가 출력됩니다.
MSDN에 소개한 효과들은 그 종류가 굉장히 많습니다.
각각의 효과는 전달하는 값에 대한 수치와 열거형이 다를 뿐, 사용하는 함수와 방법 등은 유사하므로, 문서를 따라 원하시는 효과를 적용하는 데 무리가 없을 것 입니다.
이번 글이 도움이 되셨기를 바랍니다.
감사합니다.
'C++ > 미분류' 카테고리의 다른 글
[Direct2D] ID2D1Effect : Color matrix (0) 2024.04.12 [Direct2D] ID2D1Effect : Affine transformation (0) 2024.04.09 [Direct2D] Device context 사용하기 (ID2D1DeviceContext) (1) 2024.03.29 [DirectX] 스마트 포인터 ComPtr (0) 2024.03.21 [Direct2D] 비트맵 이미지 움직이기 (2) (0) 2024.03.13