[Direct2D] ID2D1Effect : Chroma key
크로마 키(Chroma key)는 화면 합성 등의 편집을 목적으로 한 단색 배경, 혹은 그 기술을 의미합니다.
D2D는 이와 유사하게 이미지의 특정 색을 투명하게 바꾸는 효과를 제공합니다.
이번 글은 해당 효과를 이용하여, 이전 글의 검은 배경을 투명하게 편집해보도록 하겠습니다.
이번 글의 코드는 지난 글에서 이어집니다.
[Direct2D] ID2D1Effect : Edge detection
Chroma-key effect - Win32 apps | Microsoft Learn
또한, 위 MSDN에 기반하여 작성되었습니다.
1. Effect 생성 및 초기화
D2D Effect는 Device context에 의해 초기화되며, 이 때 적용활 효과에 대한 ID를 사용합니다.
크로마 키는 다음과 같이 초기화 할 수 있습니다.
ComPtr<ID2D1Effect> chromakeyEffect;
myDirect2dContext->CreateEffect(
CLSID_D2D1ChromaKey,
&chromakeyEffect
);
초기화 된 Effect객체에 이미지, 혹은 효과를 지정하는 것으로, 지정한 이미지 혹은 효과에 크로마 키 효과를 더할 수 있습니다.
이번 글은 지난 글의 Edge detection의 결과에 크로마 키 효과를 더해보도록 하겠습니다.
chromakeyEffect->SetInputEffect(0, edgeDetectionEffect.Get());
효과를 추가하는 용도로 사용되는 함수는 SetInputEffect입니다.
효과가 아닌 이미지를 적용할 경우, SetInput함수를 이용할 수 있습니다.
2. 속성 적용하기
크로마 키는 아래와 같이 몇 가지의 속성을 적용할 수 있습니다.
chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_COLOR, D2D1::ColorF({ 0.0f, 0.0f, 0.0f, 0.0f }));
chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_TOLERANCE, 0.1f);
chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_INVERT_ALPHA, false);
chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_FEATHER, false);
D2D1_CHROMAKEY_PROP_COLOR
- 투명하게 변환할 색을 지정합니다.
- 값의 형식은 D2D1::ColorF 혹은 D2D1::Vector4F입니다. 기본값은 검정색 (0, 0, 0, 0) 입니다.
D2D1_CHROMAKEY_PROP_TOLERANCE
- PROP_COLOR로 지정한 색에 대한 허용 오차를 지정합니다.
- 값의 허용 범위는 0.0 - 1.0입니다. 기본값은 0.1입니다.
D2D1_CHROMAKEY_PROP_INVERT_ALPHA
- 알파 값 반전 여부입니다.
- bool값으로 지정할 수 있습니다. 기본값은 false입니다.
D2D1_CHROMAKEY_PROP_FEATHER
- 출력 가장자리를 부드럽게 처리할지의 여부입니다.
- bool값으로 지정할 수 있습니다. 기본값은 false입니다.
위 값들은 기본 값이 있기 때문에, 코드에서 값을 지정하지 않아도 기본값을 통한 Edge detection이 수행됩니다.
D2D1_CHROMAKEY_PROP (d2d1effects_2.h) - Win32 apps | Microsoft Learn
각각의 속성에 대한 상세한 내용은 상기 MSDN에 기술되어 있습니다.
3. 출력하기
D2D Effect의 출력은 이전 글과 동일하게, DrawImage함수로 수행할 수 있습니다.
myDirect2dContext->DrawImage(
chromakeyEffect.Get(),
D2D1::Point2F(ps.x + 125.f, ps.y - 200.f));
// Add
myDirect2dContext->DrawImage(
chromakeyEffect2.Get(),
D2D1::Point2F(ps.x + 125.f, ps.y - 70.f));
myDirect2dContext->DrawImage(
chromakeyEffect3.Get(),
D2D1::Point2F(ps.x + 125.f, ps.y + 60.f));
이전 글의 여러 출력에 대응하는 크로마 키를 추가로 출력했습니다.
본문의 내용을 따라, 이전 글에 이어서 크로마 키 출력을 수행한 출력 결과는 다음과 같습니다.
해당 출력에 대한 코드 전문은 아래 Github에서 확인하실 수 있습니다.
GitHub - ruru14/WinapiStudy: WinAPI및 DirectX를 공부하며, 간단한 운동 법칙을 적용해봅니다.
WinAPI및 DirectX를 공부하며, 간단한 운동 법칙을 적용해봅니다. Contribute to ruru14/WinapiStudy development by creating an account on GitHub.
github.com
이번 글이 도움이 되셨기를 바랍니다.
감사합니다.