C++/미분류

[Direct2D] ID2D1Effect : Chroma key

ruru14 2024. 4. 22. 15:41

크로마 키(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

 

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

감사합니다.