サポートされているピクセル形式とアルファ モード
このトピックでは、各レンダー ターゲットの種類、 ID2D1Bitmap、ID2D1ImageSource など、Direct2D のさまざまな部分でサポートされるピクセル形式とアルファ モードについて説明 します。 以下のセクションが含まれます。
- DXGI イメージ ソースでサポートされている YUV 形式
- レンダー ターゲットのピクセル形式の指定
- ID2D1HwndRenderTarget でサポートされている形式
- ID2D1DeviceContext でサポートされている形式
- 互換性のあるレンダー ターゲットでサポートされている形式
- DXGI Surface レンダー ターゲットでサポートされている形式
- 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 メンバーを設定します。 次に、その構造体を適切な Create メソッド ( ID2D1Factory::CreateHwndRenderTarget など) に渡します。
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 Surface レンダー ターゲットでサポートされている形式
DXGI レンダー ターゲットは、ID2D1Factory::CreateDxgiSurfaceRenderTarget メソッドのいずれかで作成される 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 メソッドのいずれかで作成される 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 |
ID2D1DCRenderTarget では、DXGI_FORMAT_UNKNOWN形式またはD2D1_ALPHA_MODE_UNKNOWNアルファ モードを使用しないでください。 既定値がないため、 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
ブロック圧縮 (BCn) ピクセル形式のサポートの詳細については、「 ブロック圧縮」を参照してください。
サポートされている WIC 形式
CreateBitmapFromWicBitmap メソッドを使用して WIC ビットマップからビットマップを作成する場合、または IWICBitmapLock で CreateSharedBitmap メソッドを使用する場合、WIC ソースは Direct2D でサポートされる形式である必要があります。
WIC 形式 | 対応する DXGI 形式 | 対応するアルファ モード |
---|---|---|
GUID_WICPixelFormat8bppAlpha | DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHTまたはD2D1_ALPHA_MODE_PREMULTIPLIED |
GUID_WICPixelFormat32bppPRGBA | DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIEDまたは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 モードとアルファ モード
レンダー ターゲットに D2D1_ALPHA_MODE_IGNORE 以外のアルファ モードを指定した場合、テキストアンチエイリアシング モードは CLEARTYPE D2D1_TEXT_ANTIALIAS_MODE から GRAYSCALE D2D1_TEXT_ANTIALIAS_MODEに自動的に変更されます。 ( D2D1_ALPHA_MODE_UNKNOWNのアルファ モードを指定すると、レンダー ターゲットの種類に応じて、Direct2D によってアルファが設定されます)。
SetTextAntialiasMode メソッドを使用すると、テキストアンチエイリアス モードを CLEARTYPE D2D1_TEXT_ANTIALIAS_MODEに戻すことができますが、透明なサーフェスに ClearType テキストをレンダリングすると、予期しない結果が発生する可能性があります。 ClearType テキストを透明なレンダー ターゲットにレンダリングする場合は、次の 2 つの手法のいずれかを使用することをお勧めします。
- PushAxisAlignedClip メソッドを使用して、テキストがレンダリングされる領域にレンダー ターゲットをクリップし、Clear メソッドを呼び出して不透明な色を指定してから、テキストをレンダリングします。
- DrawRectangle を使用して、テキストがレンダリングされる領域の背後に不透明な四角形を描画します。
関連トピック