ビットマップ オブジェクト

注意

Windows 10上のアプリの場合は、DirectComposition ではなく Windows.UI.Composition API を使用することをお勧めします。 詳細については、「 Visual レイヤーを使用してデスクトップ アプリをモダン化する」を参照してください。

Microsoft DirectComposition は、ビットマップ合成エンジンです。 これにより、アプリケーション開発者は、複数のビットマップを結合し、さまざまな方法でそれらを操作して、アプリケーション UI で興味深い視覚効果とアニメーションを実現できます。 このトピックでは、DirectComposition でサポートされるビットマップ コンテンツの種類について説明します。

ビットマップ コンテンツ

アプリケーションは、ビジュアル オブジェクトを作成し、それらのオブジェクトの Content プロパティ を設定することで、作成およびアニメーション化するビットマップ コンテンツを DirectComposition に提供します。 DirectComposition では、ラスター化サービスは提供されません。 アプリケーションでは、 Direct2DDirect3D などの他のソフトウェア ベースまたはハードウェアアクセラレータのラスター化ライブラリを使用して、構成するビットマップを設定する必要があります。 作成後、DirectComposition は、画面にレンダリングするために、構成されたビットマップ コンテンツを デスクトップ ウィンドウ マネージャー (DWM) に渡します。

サポートされているビットマップ コンテンツの種類 Microsoft DirectComposition では、次の種類のビットマップがサポートされています。

ビデオ メモリ ビットマップ

ビデオ メモリ ビットマップは、Microsoft DirectX メソッド (DX から GDI の相互運用モデルを含む) を使用してハードウェアでラスター化されます。 これは、呼び出し元のアプリケーションと DirectComposition に表示されるクロスプロセス共有サーフェスによってサポートされます。 DirectComposition テクスチャのサーフェスからのみアプリケーションが読み取ることができるため、ビデオ メモリ ビットマップは引き裂く影響を受けません。

ビデオ コンテンツ

アプリケーションでは、DirectComposition を使用して、DirectComposition サーフェスにバインドされている DirectX ウィンドウレス スワップ チェーンを使用するビデオ フレームを作成できます。 概念的には、DirectComposition はビデオ コンテンツをビットマップのシーケンスとして扱います。 DirectComposition は、ビデオ フレームを表示する手段を提供しません。

DirectComposition は、DirectX ウィンドウレス スワップ チェーン (つまり、特定のウィンドウにバインドされていないスワップ チェーン) をサポートし、2 つの異なるアプリケーションがプロセス境界を越えてウィンドウレス スワップ チェーンを共有できるようにします。 ウィンドウなしのスワップ チェーンを共有すると、1 つのプロセスでスワップ チェーンが作成され、2 番目のプロセスで DirectComposition と共に使用されるビデオ シナリオが可能になります。 ウィンドウレス スワップ チェーンは、 IDXGIFactory2::CreateSwapChainForCompositionSurface メソッドを使用して作成されます。

DirectX スワップ チェーンの詳細については、「 DXGI の概要」を参照してください。

ステレオ コンテンツ

概念的には、ステレオ スワップ チェーンは、ステレオ 3D コンテンツの左右のチャネルを表す Microsoft DirectX グラフィックス インフラストラクチャ (DXGI) サーフェスで構成されます。 ステレオ スワップ チェーンをビジュアルのビットマップ リソースとして使用すると、DirectComposition はステレオで構成されます。 すべての非ステレオ コンテンツ (モノ コンテンツ) は、左右のチャネル コンテンツが同一であると見なされます。つまり、両方のチャネルに同じビットマップ コンテンツが使用されます。 DirectComposition は、すべての左コンテンツとすべての右コンテンツを個別に作成します。 ディスプレイ デバイスがステレオ対応でない場合、DirectComposition は (アプリケーションに応じて) 左右のステレオ チャネルをモノ コンテンツとして扱い、ビットマップ リソースのそのデータのみを使用して作成します。

DirectComposition では、ステレオ コンテンツの作成や操作はサポートされておらず、モノラル スワップ チェーンをステレオ ペアに昇格させることはできません。 DirectComposition に DirectX ステレオ コンテンツを表示する前に、アプリケーションでこれらのタスクを実行する必要があります。 また、アプリケーションでは、深さの認識のために左右のチャネル オフセットを提供する必要があります。DirectComposition では、DirectX ステレオ コンテンツの奥行きを変更するために、左右のチャネル オフセットを調整できません。

DirectX ステレオ コンテンツは、ステレオ対応ハードウェアが使用可能な場合に DWM に対して構成され、永続化されます。

ウィンドウ ビットマップ

"ウィンドウ ビットマップ" は実際のビットマップではありませんが、DirectComposition がリアルタイムで階層化された最上位ウィンドウまたは子ウィンドウのラスター化に置き換えるプレースホルダーです。 ウィンドウ ビットマップは DWM サムネイルに似ていますが、サムネイルには、所有されている非子ウィンドウなどの多くのウィンドウからのコントリビューションを含めることができるのに対し、DirectComposition ウィンドウ ビットマップは常に 1 つのウィンドウとその子のみを表します。

DirectComposition は、すべてのウィンドウとすべてのビジュアル ツリーのリダイレクト サーフェスにアクセスできるため、1 つのウィンドウのコンテンツを複数のビジュアル ツリーで再利用できます。 レイヤー化されていないウィンドウには専用のリダイレクト サーフェスがないため、ウィンドウをレイヤー化する必要があります。そのため、そのラスター化は DirectComposition で常に使用できるわけではありません。

ウィンドウ ビットマップを使用するために、アプリケーションはビジュアルをウィンドウ ハンドル (HWND) に関連付けます。 その後、DirectComposition は、ウィンドウに関連付けられているビジュアル ツリーに対する変更の結果としてコンテンツが変更されたときなど、ウィンドウの内容が変更されるたびにビジュアルを再作成します。 つまり、DWM サムネイルと同様に、DirectComposition ウィンドウビットマップは "ライブ" です。

ビットマップ コンテンツとビジュアルの関連付け

3 種類のビットマップすべてについて、アプリケーションは同じビットマップを複数のビジュアルに関連付けることができます。つまり、1 つのメモリ割り当てを使用して同じコンテンツを複数回表示できます。

アルファ チャネル

すべてのビットマップには 32 ビット/ピクセル (BPP) 形式があり、ピクセルごとの透明度を表す 8 ビットが含まれます。 ただし、アプリケーションでは、DirectComposition でアルファ チャネルを使用する方法を指定できます。 特に、DirectComposition はアルファ チャネルを考慮することも、アルファチャネルを完全に無視することもできます。この場合、ビットマップは完全に不透明であると見なされます。

追加のアルファ モードではアルファ チャネルは無視されますが、赤、緑、青の値は、チャネルの通常の解釈ではなく、チャネルごとのアルファ値として扱われます。 このモードは、サブピクセル カバレッジ情報を必要とする ClearType レンダリングに役立ちます。 チャネルごとのアルファ モードを使用するには、アプリケーションで最初に Direct2DDirectWriteを使用して、サブピクセル カバレッジ データをビットマップに書き込む必要があります。 次に、アプリケーションで正しいアルファ モードを設定し、ビットマップをビジュアルに関連付けるときにテキストの色を指定する必要があります。 DirectComposition では、テキストの色とカバレッジ データがブレンドされ、背景に対して ClearType ブレンドが生成されます。

ビットマップがピクセルアラインおよび軸揃えでない場合や中間サーフェスに描画する必要がある場合など、ClearType アルゴリズムが適用されない場合、DirectComposition では、ビットマップ内のサブピクセル カバレッジ データを使用して、代わりに自動的かつ追加コストなしでグレースケールのラスター化を生成できます。

詳細については、IDCompositionDevice::CreateSurface 関数または IDCompositionDevice::CreateVirtualSurface 関数の alphaMode パラメーターの説明を参照してください。

DirectComposition の概念