手記
Windows 10 上のアプリでは、DirectComposition の代わりに Windows.UI.Composition API を使用することをお勧めします。 詳細については、「ビジュアル レイヤーを使用してデスクトップ アプリをモダン化する」を参照してください。
Microsoft DirectComposition はビットマップ合成エンジンです。 これにより、アプリケーション開発者は複数のビットマップを組み合わせて、さまざまな方法でそれらを操作して、アプリケーション UI で興味深い視覚効果とアニメーションを実現できます。 このトピックでは、DirectComposition でサポートされるビットマップ コンテンツの種類について説明します。
- ビットマップ コンテンツ を する
- ビデオ メモリ ビットマップ を する
- ウィンドウ ビットマップ を する
- ビットマップ コンテンツとビジュアル の関連付け
- アルファ チャネル を する
- 関連トピック
ビットマップ コンテンツ
アプリケーションは、ビジュアル オブジェクトを作成し、それらのオブジェクトの Content プロパティを設定することによって、作成およびアニメーション化するビットマップ コンテンツを DirectComposition に提供します。 DirectComposition では、ラスタライズ サービスは提供されません。 アプリケーションは、Direct2D や Direct3D など、他のソフトウェア ベースまたはハードウェアアクセラレータによるラスタライズ ライブラリを使用して、構成するビットマップを設定する必要があります。 作成後、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 Overview」を参照してください。
ステレオ コンテンツ
概念的には、ステレオ スワップ チェーンは、ステレオ 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 レンダリングに役立ちます。 チャネルごとのアルファ モードを使用するには、アプリケーションで最初に Direct2D 使用し、DirectWrite を して、サブピクセル カバレッジ データをビットマップに書き込む必要があります。 次に、アプリケーションは正しいアルファ モードを設定し、ビットマップをビジュアルに関連付けるときにテキストの色を指定する必要があります。 DirectComposition では、テキストの色とカバレッジ データがブレンドされ、背景に対して ClearType ブレンドが生成されます。
ビットマップがピクセルアラインおよび軸揃えでない場合や中間サーフェスに描画する必要がある場合など、ClearType アルゴリズムが適用されない場合、DirectComposition はビットマップ内のサブピクセル カバレッジ データを使用して、代わりに自動的かつ追加料金なしでグレースケールラスタライズを生成できます。
詳細については、IDCompositionDevice::CreateSurface または IDCompositionDevice::CreateVirtualSurface 関数の alphaMode パラメーターの説明を参照してください。
関連トピック