다음을 통해 공유


미리 곱한 알파

컴퓨터 그래픽에는 색 값의 불투명도를 나타내는 두 가지 방법이 있습니다. Win2D는 두 가지 방법을 모두 사용합니다. 이 문서에서는 차이점과 여기서 사용되는 위치를 설명합니다.

직선 알파

직선(선형이라고도 함)을 사용하는 경우 알파:

  • RGB 값은 그려지는 항목의 색을 지정합니다.
  • 알파 값은 알파 값이 얼마나 단단한지를 지정합니다.

이 세계에서 RGB와 알파는 독립적입니다. 다른 항목에 영향을 주지 않고 변경할 수 있습니다. 개체가 페이드 아웃되도록 하려면 RGB를 변경하지 않고 알파 값을 점진적으로 줄입니다.

직선 알파 형식을 사용하는 두 색 간의 소스 오버 혼합을 수행하려면 다음을 수행합니다.

result = (source.RGB * source.A) + (dest.RGB * (1 - source.A))

미리 곱한 알파

미리 곱한 알파를 사용하는 경우:

  • RGB는 그리는 항목이 출력에 미치는 색을 지정합니다.
  • 알파 값은 뒤에 무엇이 있는지 가릴 정도를 지정합니다.

이 세계에서는 RGB와 알파가 연결되어 있습니다. 개체를 투명하게 만들려면 RGB(색을 줄이기 위해)와 알파를 모두 줄여야 합니다(그 뒤에 있는 모든 것을 모호하게 하기 위해). 완전히 투명한 개체에는 더 이상 색이 없으므로 100% 투명도를 나타내는 값은 RGB와 알파 모두 0입니다.

직선 알파 형식을 사용하는 두 색 간의 소스 오버 혼합을 수행합니다.

result = source.RGB + (dest.RGB * (1 - source.A))

미리 곱한 알파는 이미지를 필터링하거나 다른 레이어를 작성할 때 직선 알파보다 더 나은 결과를 제공하기 때문에 그래픽 렌더링에 사용됩니다. 자세한 내용은 다음 블로그 게시물을 참조하세요.

Win2D의 알파

Win2D는 API 화면에서 직선 알파를 사용하지만 내부 렌더링 작업에는 미리 곱한 알파를 사용합니다.

Windows.UI.Color 값은 직선 알파를 사용합니다. 색을 Draw* 또는 Fill* 메서드에 전달하거나, 브러시의 색을 설정하거나, 색 값으로 지울 때마다 이 색은 직선 알파를 사용하여 지정됩니다.

비트맵 또는 rendertarget에 저장된 픽셀 값과 이러한 표면에서 작동하는 그리기 또는 혼합 작업은 미리 곱한 알파를 사용합니다. 파일에서 비트맵이 로드되면 해당 콘텐츠가 자동으로 미리 곱한 형식으로 변환됩니다. Win2D 그리기 메서드를 호출하면 실제 그리기 전에 해당 색 매개 변수가 직선에서 미리 곱한 값으로 변환됩니다.

Win2D 이미지 효과는 직선 및 미리 곱한 알파의 혼합물을 사용합니다. 일부 효과는 한 형식에서 작동하고, 일부는 다른 형식에서 작동하고, 일부는 선택할 수 있는 속성을 제공합니다. 각 효과 형식에 대한 설명서에서는 사용하는 알파 모드를 설명합니다. 효과 입력 데이터는 항상 미리 곱한 것으로 간주되므로 효과가 직선 알파로 작동해야 하는 경우 먼저 예기치 않은 변환을 적용하고 효과를 계산한 다음 출력을 다시 미리 계산합니다.

비트맵 API GetPixelBytes, SetPixelBytes, GetPixelColors, 및 SetPixelColors 알파 형식 변환을 수행하지 않습니다. 기본 GPU 텍스처 간에 비트 값을 직접 전송합니다. 이렇게 하면 Win2D에서 내부적으로 사용하는 알파 형식을 확인할 수 있습니다.

  • rendertarget에 그리기 세션 만들기
  • drawingSession.Clear(Colors.Tranparent) 호출
  • Colors.Tranparent는 R = 255, G = 255, B = 255, A = 0으로 정의됩니다.
  • Win2D는 이 값을 미리 계산된 형식으로 변환하여 R = 0, G = 0, B = 0, A = 0을 생성합니다.
  • rendertarget의 내용을 다시 읽는 데 GetPixelColors을 사용
  • 원래 직선 알파 Colors.Tranparent 값과 같이 RGB = 255가 아닌 미리 곱한 형식 RGB = 0이 포함되어 있음을 확인합니다.

알파 형식 간 변환

직선 알파 색 값을 미리 곱한 형식으로 변환하려면 R, G 및 B 값을 A로 곱합니다. 미리 곱한 값을 직선으로 변환하려면 R, G 및 B를 A로 나눕니다.

색 정보는 0에서 255 사이의 바이트 값으로 표현되는 경우가 많습니다(예: Windows.UI.Color 구조체는 4바이트로 구성됨). 이 표현은 255의 인수로 확장되므로 255의 바이트 값은 실제로 1을 의미하고 128은 절반 강도입니다. 형식 변환 중에 해당 배율 인수를 고려해야 하므로 직선에서 미리 곱한 값으로 Windows.UI.Color을 변환하려면 다음을 수행해야 합니다.

premultiplied.R = (byte)(straight.R * straight.A / 255);
premultiplied.G = (byte)(straight.G * straight.A / 255);
premultiplied.B = (byte)(straight.B * straight.A / 255);
premultiplied.A = straight.A;

잘못된 알파 형식 PremultiplyEffect 또는 UnPremultiplyEffect을 변환하는 데 사용할 수 있는 이미지 데이터가 있는 경우