サポートされているピクセル形式とアルファ モード
このトピックでは、各レンダリング ターゲット タイプ、 ID2D1Bitmap、 ID2D1ImageSourceなど、Direct2D のさまざまな部分でサポートされているピクセル形式とアルファ モードについて説明します。 以下のセクションが含まれています。
- DXGI 画像ソースでサポートされている YUV 形式
- レンダリング ターゲットのピクセル形式の指定
- ID2D1HwndRenderTarget でサポートされている形式
- ID2D1DeviceContext でサポートされている形式
- 互換性のあるレンダーターゲットでサポートされている形式
- DXGI サーフェス レンダー ターゲットでサポートされている形式
- WIC ビットマップ レンダリング ターゲットでサポートされている形式
- ID2D1DCRenderTarget でサポートされている形式
- ID2D1Bitmap のピクセル形式の指定
- サポートされていない形式の使用
- アルファモードについて
- 関連トピック
DXGI 画像ソースでサポートされている YUV 形式
ID2D1ImageSource はピクセルの抽象化されたプロバイダーです。 これは、WIC (CreateImageSourceFromWic) または IDXGISurface (CreateImageSourceFromDxgi) のいずれかからインスタンス化できます。
ID2D1ImageSourceFromWic は、 ID2D1Bitmapと同じピクセル形式とアルファ モードのセットをサポートします。
上記に加えて、 IDXGISurface からインスタンス化される ID2D1ImageSource も、複数のサーフェスに分割された平面データを含むいくつかの YUV ピクセル形式をサポートします。 各ピクセル形式の要件の詳細については、 CreateImageSourceFromDxgi を参照してください。
形式 |
---|
DXGI_FORMAT_AYUV |
DXGI_FORMAT_NV12 |
DXGI_FORMAT_YUY2 |
DXGI_FORMAT_P208 |
DXGI_FORMAT_V208 |
DXGI_FORMAT_V408 |
DXGI_FORMAT_R8_UNORM |
DXGI_FORMAT_R8G8_UNORM |
レンダリング ターゲットのピクセル形式の指定
レンダー ターゲットを作成するときは、ピクセル形式を指定する必要があります。 ピクセル形式を指定するには、 D2D1_PIXEL_FORMAT 構造体を使用して、 D2D1_RENDER_TARGET_PROPERTIES 構造体の pixelFormat メンバーを設定します。 次に、その構造体を ID2D1Factory::CreateHwndRenderTargetなどの適切な Create メソッドに渡します。
D2D1_PIXEL_FORMAT 構造には 2 つのフィールドがあります。
- format、各ピクセルのチャンネルのサイズと配置を記述する DXGI_FORMAT 値、および
- alpha、アルファ情報がどのように解釈されるかを説明するD2D1_ALPHA_MODE 値。
次の例では、 D2D1_PIXEL_FORMAT 構造体を作成し、それを使用して ID2D1HwndRenderTarget のピクセル形式とアルファ モードを指定します。
RECT rc;
GetClientRect(m_hwnd, &rc);
D2D1_SIZE_U size = D2D1::SizeU(
rc.right - rc.left,
rc.bottom - rc.top
);
// Create a pixel format and initial its format
// and alphaMode fields.
D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat(
DXGI_FORMAT_B8G8R8A8_UNORM,
D2D1_ALPHA_MODE_IGNORE
);
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties();
props.pixelFormat = pixelFormat;
// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
props,
D2D1::HwndRenderTargetProperties(m_hwnd, size),
&m_pRT
);
レンダリング ターゲットによって、サポートされる形式とアルファ モードの組み合わせが異なります。 次のセクションでは、各レンダリング ターゲットでサポートされている形式とアルファの組み合わせを示します。
ID2D1HwndRenderTarget でサポートされている形式
ID2D1HwndRenderTarget でサポートされる形式は、ハードウェアまたはソフトウェアを使用してレンダリングするかどうか、または Direct2D がデフォルトでレンダリング モードを自動的に処理するかどうかによって異なります。
Note
パフォーマンスを向上させるには、ピクセル形式として DXGI_FORMAT_B8G8R8A8_UNORM を使用することをお勧めします。 これは、ソフトウェア レンダリング ターゲットに特に役立ちます。 BGRA 形式のターゲットは RGBA 形式よりもパフォーマンスが優れています。
ID2D1HwndRenderTarget を作成するときは、 D2D1_RENDER_TARGET_PROPERTIES 構造体を使用してレンダリング オプションを指定します。 オプションには、前のセクションで説明したピクセル形式が含まれます。 この構造体の type フィールドを使用すると、レンダー ターゲットをハードウェアにレンダリングするかソフトウェアにレンダリングするか、または Direct2D がレンダリング モードを自動的に決定するかどうかを指定できます。
Direct2D がレンダー ターゲットでハードウェア レンダリングを使用するかソフトウェア レンダリングを使用するかを決定できるようにするには、 D2D1_RENDER_TARGET_TYPE_DEFAULT 設定を使用します。
次の表は、 D2D1_RENDER_TARGET_TYPE_DEFAULT 設定を使用して作成される ID2D1HwndRenderTarget オブジェクトでサポートされる形式を示しています。
形式 | アルファモード |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
レンダー ターゲットでハードウェア レンダリングを強制的に使用するには、 D2D1_RENDER_TARGET_TYPE_HARDWARE 設定を使用します。 次の表は、ハードウェア レンダリングを明示的に使用する ID2D1HwndRenderTarget オブジェクトでサポートされている形式を示しています。
形式 | アルファモード |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
レンダー ターゲットでソフトウェア レンダリングを強制的に使用するには、 D2D1_RENDER_TARGET_TYPE_SOFTWARE 設定を使用します。 次の表は、ソフトウェア レンダリングを明示的に使用する ID2D1HwndRenderTarget オブジェクトでサポートされている形式を示しています。
形式 | アルファモード |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
ID2D1HwndRenderTarget がハードウェア アクセラレーションされているかどうかに関係なく、 DXGI_FORMAT_UNKNOWN 形式ではデフォルトで DXGI_FORMAT_B8G8R8A8 が使用され、 D2D1_ALPHA_MODE_UNKNOWN アルファ モードではデフォルトで D2D1_ALPHA_MODE_IGNORE が使用されます。
ID2D1DeviceContext でサポートされている形式
Windows 8 以降では、 デバイス コンテキスト は次のような Direct3D ハイカラー フォーマット をさらに活用します。
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_R16G16B16A16_UNORM
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R32G32B32A32_FLOAT
特定のデバイス コンテキストでフォーマットが機能するかどうかを確認するには、 ID2D1DeviceContext::IsDxgiFormatSupported メソッドを使用します。 これらの形式は、 ID2D1HwndRenderTargetでも機能する可能性があります。
これらの形式は、Windows 7 の ID2D1HwndRenderTarget インターフェイスでサポートされている形式に加えて提供されます。 詳細については、 デバイスとデバイス コンテキスト を参照してください。
互換性のあるレンダーターゲットでサポートされている形式
互換性のあるレンダリング ターゲット (ID2D1RenderTarget::CreatecompatibleRenderTarget メソッドのいずれかによって作成された ID2D1BitmapRenderTarget) は、それを作成したレンダリング ターゲットのサポートされている形式とアルファ モードを継承します。 互換性のあるレンダリング ターゲットは、親がサポートしているかどうかに関係なく、次の形式とアルファ モードの組み合わせもサポートします。
形式 | アルファモード |
---|---|
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHT |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN 形式ではデフォルトで親のレンダリング ターゲット形式が使用され、 D2D1_ALPHA_MODE_UNKNOWN アルファ モードではデフォルトで D2D1_ALPHA_MODE_PREMULTIPLIED が使用されます。
DXGI サーフェス レンダー ターゲットでサポートされている形式
DXGI レンダー ターゲットは、 ID2D1Factory::CreateDxgiSurfaceRenderTarget メソッドの 1 つによって作成される ID2D1RenderTarget です。 以下の形式とアルファモードの組み合わせをサポートします。
形式 | アルファモード |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHT |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
Note
形式は、DXGI サーフェス レンダー ターゲットが描画する DXGI サーフェスの形式と一致する必要があります。
DXGI_FORMAT_UNKNOWN 形式では、デフォルトで DXGI サーフェス形式が使用されます。 DXGI サーフェス レンダー ターゲットでは、 D2D1_ALPHA_MODE_UNKNOWN アルファ モードを使用しないでください。 デフォルト値がないため、DXGI サーフェス レンダリング ターゲットの作成が失敗します。
WIC ビットマップ レンダリング ターゲットでサポートされている形式
WIC ビットマップ レンダリング ターゲットは、 ID2D1Factory::CreateWicBitmapRenderTarget メソッドの 1 つによって作成される ID2D1RenderTarget です。 以下の形式とアルファモードの組み合わせをサポートします。
形式 | アルファモード |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHT |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
WIC ビットマップ ターゲットのピクセル形式は、WIC ビットマップのピクセル形式と一致する必要があります。
DXGI_FORMAT_UNKNOWN 形式ではデフォルトで WIC ビットマップ形式が使用され、D2D1_ALPHA_MODE_UNKNOWN アルファ モードではデフォルトで WIC ビットマップ アルファ モードが使用されます。
ID2D1DCRenderTarget でサポートされている形式
ID2D1DCRenderTarget は、次の形式とアルファ モードの組み合わせをサポートします。
形式 | アルファモード |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN 形式または D2D1_ALPHA_MODE_UNKNOWN アルファ モードを ID2D1DCRenderTarget で使用しないでください。 デフォルト値がないため、 ID2D1DCRenderTarget の作成が失敗します。
ID2D1Bitmap のピクセル形式の指定
一般に、 ID2D1Bitmap オブジェクトは次の形式とアルファ モードをサポートします (いくつかの制限があり、次の段落で説明します)。
形式 | アルファモード |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHT |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_B8G8R8X8_UNORM (Windows 8.1 以降のみ) | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_BC1_UNORM (Windows 8.1 以降のみ) | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_BC1_UNORM (Windows 8.1 以降のみ) | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_BC1_UNORM (Windows 8.1 以降のみ) | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_BC2_UNORM (Windows 8.1 以降のみ) | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_BC2_UNORM (Windows 8.1 以降のみ) | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_BC2_UNORM (Windows 8.1 以降のみ) | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_BC3_UNORM (Windows 8.1 以降のみ) | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_BC3_UNORM (Windows 8.1 以降のみ) | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_BC3_UNORM (Windows 8.1 以降のみ) | D2D1_ALPHA_MODE_UNKNOWN |
ID2D1RenderTarget::CreateSharedBitmap メソッドを使用する場合、 D2D1_BITMAP_PROPERTIES 構造体の pixelFormat フィールドを使用して、新しいレンダー ターゲットのピクセル形式を指定します。 ID2D1Bitmap ソースのピクセル形式と一致する必要があります。
CreateBitmapFromWicBitmap メソッドを使用する場合、(D2D1_RENDER_TARGET_PROPERTIES 構造体の pixelFormat メンバーではなく) D2D1_BITMAP_PROPERTIES 構造体の pixelFormat フィールドを使用して、新しいレンダリング ターゲットのピクセル形式を指定します。 WIC ビットマップ ソースのピクセル形式と一致する必要があります。
Note
ブロック圧縮 (BCₙ) ピクセル形式のサポートの詳細については、「ブロック圧縮」を参照してください。
サポートされている WIC 形式
CreateBitmapFromWicBitmap メソッドを使用して WIC ビットマップからビットマップを作成する場合、または CreateSharedBitmap メソッドを IWICBitmapLockと共に使用する場合は、WIC ソースが Direct2D でサポートされている形式である必要があります。
WIC 形式 | 対応するDXGI形式 | 対応するアルファモード |
---|---|---|
GUID_WICPixelFormat8bppAlpha | DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHT or D2D1_ALPHA_MODE_PREMULTIPLIED |
GUID_WICPixelFormat32bppPRGBA | DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED or D2D1_ALPHA_MODE_IGNORE |
GUID_WICPixelFormat32bppBGR | DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
GUID_WICPixelFormat32bppPBGRA | DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
WIC ビットマップをサポートされている形式に変換する方法の例については、「ファイルからビットマップを読み込む方法」を参照してください。
サポートされていない形式の使用
前の表に記載されているピクセル形式とアルファ モード以外の組み合わせを使用すると、 D2DERR_UNSUPPORTED_PIXEL_FORMAT または E_INVALIDARG エラーが発生します。
アルファモードについて
プリマルチプライモードとストレートアルファモードについて
D2D1_ALPHA_MODE 列挙体は、アルファ チャネルがプリマルチプライ アルファを使用するか、ストレート アルファを使用するか、または無視して不透明と見なすかを示します。 ストレートアルファでは、アルファ チャネルは色の透明度に対応する値を示します。
色は、出力形式に関係なく、Direct2D 描画コマンドとブラシによって常にストレートアルファとして扱われます。
プリマルチプライアルファでは、各カラー チャネルはアルファ値によってスケーリングされます。 通常、カラー チャネルの値はアルファ チャネルの値より大きくなりません。 事前乗算形式のカラー チャネル値がアルファ チャネルより大きい場合、標準のソースオーバー ブレンディング計算によって加算ブレンドが作成されます。
アルファ チャネル自体の値は、ストレート アルファとプリマルチプライ アルファの両方で同じです。
ストレートアルファとプレマルチプライアルファの違い
ストレートアルファを使用して RGBA カラーを記述する場合、カラーのアルファ値はアルファ チャネルに保存されます。 たとえば、不透明度が 60% の赤色を表すには、次の値を使用します: (255, 0, 0, 255 * 0.6) = (255, 0, 0, 153)。 255 の値は完全な赤を示し、153 (255 の 60 パーセント) は色の不透明度が 60 パーセントであることを示します。
プリマルチプライアルファを使用して RGBA カラーを記述する場合、各カラーにアルファ値が乗算されます: (255 * 0.6、0 * 0.6、0 * 0.6、255 * 0.6) = (153、0、0、153)。
レンダー ターゲットのアルファ モードに関係なく、 D2D1_COLOR_F 値は常にストレート アルファとして解釈されます。 たとえば、プリマルチプライ アルファ モードを使用するレンダー ターゲットで使用する ID2D1SolidColorBrush の色を指定する場合は、レンダー ターゲットがストレート アルファを使用する場合と同じように色を指定します。 ブラシでペイントすると、Direct2D によって色が目的の形式に変換されます。
レンダーターゲットのアルファモード
アルファ モードの設定に関係なく、レンダリング ターゲットのコンテンツは透明度をサポートします。 たとえば、アルファ モードが D2D1_ALPHA_MODE_IGNORE のレンダリング ターゲットを使用して部分的に透明な赤い四角形を描画すると、四角形はピンク色で表示されます (背景が白の場合)。
アルファ モードが D2D1_ALPHA_MODE_PREMULTIPLIED のときに部分的に透明な赤い四角形を描画すると、四角形はピンク色で表示され (背景が白であると仮定)、レンダリング ターゲットの背後にあるものを透かして見ることができます。 これは、 ID2D1DCRenderTarget を使用して透明なウィンドウにレンダリングする場合、または互換性のあるレンダリング ターゲット (CreatecompatibleRenderTarget メソッドによって作成されたレンダリング ターゲット) を使用して透明性をサポートするビットマップを作成する場合に便利です。
ClearType と Alpha モード
レンダー ターゲットに D2D1_ALPHA_MODE_IGNORE 以外のアルファ モードを指定すると、テキストのアンチエイリアシング モードは D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE から D2D1_TEXT_ANTIALIAS_MODE GRAYSCALEに自動的に変更されます。 (アルファ モード D2D1_ALPHA_MODE_UNKNOWN を指定すると、Direct2D はレンダー ターゲットの種類に応じてアルファを設定します。)
SetTextAntialiasMode メソッドを使用して、テキストのアンチエイリアス モードを D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE に戻すことができますが、ClearType テキストを透明な表面にレンダリングすると、予期しない結果が生じる可能性があります。 ClearType テキストを透明なレンダリング ターゲットにレンダリングする場合は、次の 2 つの手法のいずれかを使用することをお勧めします。
- PushAxisAlignedClip メソッドを使用して、テキストがレンダリングされる領域にレンダリング ターゲットをクリップし、 Clear メソッドを呼び出して不透明な色を指定してから、テキストをレンダリングします。
- DrawRectangle を使用して、テキストがレンダリングされる領域の背後に不透明な四角形を描画します。