다음을 통해 공유


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 흰색

rgb 색을 보여 주는 이미지

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 픽셀 레이아웃을 보여 줍니다.

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 애플리케이션의 성능 향상을 참조하세요.

다음

Direct2D에 변환 적용