Direct2D에서 색 사용
Direct2D는 빨강, 녹색 및 파랑의 다양한 값을 조합하여 색이 형성되는 RGB 색 모델을 사용합니다. 네 번째 구성 요소인 알파는 픽셀의 투명도를 측정합니다. Direct2D에서 이러한 각 구성 요소는 범위가 [0.0 1.0]인 부동 소수점 값입니다. 세 가지 색 구성 요소의 경우 값은 색의 강도를 측정합니다. 알파 구성 요소의 경우 0.0은 완전히 투명하고 1.0은 완전히 불투명한 것을 의미합니다. 다음 표에서는 100% 강도의 다양한 조합으로 인해 발생하는 색을 보여 줍니다.
빨간색 | 녹색 | 파랑 | Color |
---|---|---|---|
0 | 0 | 0 | 검정 |
1 | 0 | 0 | 빨강 |
0 | 1 | 0 | 녹색 |
0 | 0 | 1 | 파랑 |
0 | 1 | 1 | 녹청 |
1 | 0 | 1 | 자홍 |
1 | 1 | 0 | 노란색 |
1 | 1 | 1 | 흰색 |
0에서 1 사이의 색 값은 이러한 순수 색의 다른 음영을 생성합니다. Direct2D는 D2D1_COLOR_F 구조체를 사용하여 색을 나타냅니다. 예를 들어 다음 코드는 자홍색을 지정합니다.
// Initialize a magenta color.
D2D1_COLOR_F clr;
clr.r = 1;
clr.g = 0;
clr.b = 1;
clr.a = 1; // Opaque.
D2D1_COLOR_F 구조체에서 파생되는 D2D1::ColorF 클래스를 사용하여 색을 지정할 수도 있습니다.
// Equivalent to the previous example.
D2D1::ColorF clr(1, 0, 1, 1);
알파 혼합
알파 혼합은 다음 수식을 사용하여 전경색을 배경색과 혼합하여 반투명 영역을 만듭니다.
- color = af * Cf + (1 - af) * Cb
여기서 Cb는 배경색이고 Cf는 전경색이고 af는 전경색의 알파 값입니다. 이 수식은 각 색 구성 요소에 쌍으로 적용됩니다. 예를 들어 전경색이 (R = 1.0, G = 0.4, B = 0.0)이고 alpha = 0.6이며, 배경색이 (R = 0.0, G = 0.5, B = 1.0)이라고 가정합니다. 결과 알파 혼합 색은 다음과 같습니다.
R = (1.0 * 0.6 + 0 * 0.4) = .6
G = (0.4 * 0.6 + 0.5 * 0.4) = .44
B = (0 * 0.6 + 1.0 * 0.4) = .40
다음 이미지는 이 혼합 작업의 결과를 보여 줍니다.
픽셀 형식
D2D1_COLOR_F 구조체는 픽셀이 메모리에 표시되는 방식을 설명하지 않습니다. 대부분의 경우 이러한 사실은 중요하지 않습니다. Direct2D는 색 정보를 픽셀로 변환하는 모든 내부 세부 정보를 처리합니다. 그러나 메모리에서 비트맵으로 직접 작업하거나 Direct2D를 Direct3D 또는 GDI와 결합하는 경우 픽셀 형식을 알아야 할 수 있습니다.
DXGI_FORMAT 열거형은 픽셀 형식 목록을 정의합니다. 목록은 상당히 길지만 그중 일부만 Direct2D와 관련이 있습니다. (다른 항목은 Direct3D에서 사용됨)
픽셀 형식 | 설명 |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM |
가장 일반적인 픽셀 형식입니다. 모든 픽셀 구성 요소(빨강, 녹색, 파랑 및 알파)는 8비트 부호 없는 정수입니다. 구성 요소는 메모리에서 BGRA 순서로 정렬됩니다. (다음 그림을 참조하세요.) |
DXGI_FORMAT_R8G8B8A8_UNORM |
픽셀 구성 요소는 RGBA 순서의 8비트 부호 없는 정수입니다. 즉, 빨간색 및 파란색 구성 요소는 DXGI_FORMAT_B8G8R8A8_UNORM을 기준으로 교체됩니다. 이 형식은 하드웨어 디바이스에서만 지원됩니다. |
DXGI_FORMAT_A8_UNORM |
이 형식에는 RGB 구성 요소가 없는 8비트 알파 구성 요소가 포함되어 있습니다. 불투명 마스크를 만드는 데 유용합니다. Direct2D에서 불투명 마스크를 사용하는 방법에 대한 자세한 내용은 호환 가능한 A8 렌더링 대상 개요를 참조하세요. |
다음 그림에서는 BGRA 픽셀 레이아웃을 보여 줍니다.
렌더링 대상의 픽셀 형식을 가져오려면 ID2D1RenderTarget::GetPixelFormat을 호출합니다. 픽셀 형식이 디스플레이 해상도와 일치하지 않을 수 있습니다. 예를 들어 렌더링 대상이 32비트 색을 사용하더라도 디스플레이는 16비트 색으로 설정될 수 있습니다.
알파 모드
렌더링 대상에는 알파 값 처리 방법을 정의하는 알파 모드도 있습니다.
알파 모드 | 설명 |
---|---|
D2D1_ALPHA_MODE_IGNORE | 알파 혼합이 수행되지 않습니다. 다른 값은 무시됩니다. |
D2D1_ALPHA_MODE_STRAIGHT | 직선 알파입니다. 픽셀의 색 구성 요소는 알파 혼합 이전의 색 강도를 나타냅니다. |
D2D1_ALPHA_MODE_PREMULTIPLIED | 미리 곱한 알파입니다. 픽셀의 색 구성 요소는 알파 값을 곱한 색 강도를 나타냅니다. 이 형식은 알파 혼합 수식의 항(af Cf)이 미리 계산되기 때문에 직선 알파보다 렌더링하는 데 더 효율적입니다. 그러나 이 형식은 이미지 파일에 저장하는 데 적합하지 않습니다. |
다음은 직선 알파와 미리 곱한 알파의 차이점을 보여 주는 예입니다. 원하는 색이 알파가 50%인 순수 빨강(100% 강도)이라고 가정합니다. Direct2D 형식이므로 이 색은 (1, 0, 0, 0.5)로 표시됩니다. 직선 알파를 사용하고 8비트 색 구성 요소를 가정하면 픽셀의 빨간색 구성 요소는 0xFF입니다. 미리 곱한 알파를 사용하면 빨간색 구성 요소는 50%만큼 확장되어 0x80이 됩니다.
D2D1_COLOR_F 데이터 형식은 항상 직선 알파를 사용하여 색을 나타냅니다. Direct2D는 필요한 경우 픽셀을 미리 곱한 알파 형식으로 변환합니다.
프로그램에서 알파 혼합을 수행하지 않는다는 것을 알고 있는 경우 D2D1_ALPHA_MODE_IGNORE 알파 모드로 렌더링 대상을 만듭니다. Direct2D는 알파 계산을 건너뛸 수 있으므로 이 모드는 성능 향상을 가져올 수 있습니다. 자세한 내용은 Direct2D 애플리케이션의 성능 향상을 참조하세요.