Direct2D での色の使用
Direct2D は RGB カラー モデルを使用します。このモデルでは、赤、緑、青のさまざまな値を組み合わせて色を形成します。 4 番目のコンポーネントであるアルファは、ピクセルの透明度を測定します。 Direct2D では、これらの各コンポーネントは [0.0 1.0] の範囲の浮動小数点値です。 3 つの色成分の場合、値は色の強度を測定します。 アルファ 成分の場合、0.0 は完全に透明、1.0 は完全に不透明を意味します。 次の表は、100% 強度のさまざまな組み合わせから生じる色を示しています。
[赤] | [緑] | 青 | Color |
---|---|---|---|
0 | 0 | 0 | Black |
1 | 0 | 0 | [赤] |
0 | 1 | 0 | [緑] |
0 | 0 | 1 | 青 |
0 | 1 | 1 | シアン |
1 | 0 | 1 | 赤紫 |
1 | 1 | 0 | 黄 |
1 | 1 | 1 | White |
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)、 アルファ = 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 で使用されます)。
ピクセル形式 | Description |
---|---|
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 アプリケーションのパフォーマンスの向上」を参照してください。