ID2D1CommandList インターフェイス (d2d1_1.h)
記録および再生できる一連のコマンドを表します。
継承
ID2D1CommandList インターフェイスは、ID2D1Image から継承されます。 ID2D1CommandList には、次の種類のメンバーもあります。
メソッド
ID2D1CommandList インターフェイスには、これらのメソッドがあります。
ID2D1CommandList::Close コマンドを効果への入力として、または ID2D1DeviceContext::D rawImage の呼び出しで使用できるように、コマンドの受け入れ停止をコマンド リストに指示します。 |
ID2D1CommandList::Stream 指定したコマンド シンクにコマンド リストの内容をストリーミングします。 |
解説
コマンド リストには、記録されたコマンド セットを含むリソースの静的コピーは含まれません。 すべてのビットマップ、効果、およびジオメトリは、実際のリソースへの参照として格納され、すべてのブラシは値によって格納されます。 すべてのリソースの作成と破棄は、コマンド リストの外部で行われます。 次の表に、リソースと、コマンド リスト内でのリソースの処理方法を示します。
リソース | コマンド リストによる処理方法 |
---|---|
純色ブラシ | 値によって渡されます。 |
ビットマップ ブラシ | ブラシは値渡しされますが、ブラシの作成に使用されるビットマップは実際には参照されます。 |
グラデーション ブラシ – 線形グラデーションと放射状グラデーションの両方 | ブラシは値渡しされますが、グラデーションの停止コレクション自体が参照されます。 グラデーションの停止コレクション オブジェクトは変更できません。 |
ビットマップ | 参照渡し。 |
描画状態ブロック | デバイス コンテキストの実際の状態は、set transform などのセット関数に変換され、値によって渡されます。 |
ジオメトリ | 値渡しされた不変オブジェクト。 |
ストローク のスタイル | 値渡しされた不変オブジェクト。 |
メッシュ型 | 値渡しされた不変オブジェクト。 |
CommandList をターゲットとして使用する
次の擬似コードは、ターゲットがコマンド リストまたはビットマップとして設定されるさまざまなケースを示しています。//create a D2D device from an already created DXGI device
ID2D1Device *pD2D1Device;
pD2D1Factory->CreateDevice(pDxgiDevice, &pD2D1Device);
//create a D2D device context from the D2D device
ID2D1DeviceContext *pD2D1DeviceContext;
pD2D1Device->CreateD2D1DeviceContext(&pD2D1DeviceContext);
//create command list
ID2D1CommandList *pCommandList1;
pD2D1DeviceContext->CreateCommandList(&pCommandList1);
//CreateBitmap
ID2D1Bitmap *pBitmap1;
ID2D1Bitmap *pBitmap2;
pD2D1DeviceContext->CreateBitmap(…, &pBitmap1);
pD2D1DeviceContext->CreateBitmap(…, &pBitmap2);
//Set the bitmap as the target
pD2D1DeviceContext->SetTarget(pBitmap1);
pD2D1DeviceContext->BeginDraw();
RenderMyVectorContent(pD2D1DeviceContext);
pD2D1DeviceContext->EndDraw();
//Set the command list as the target
pD2D1DeviceContext->SetTarget(pCommandList1);
pD2D1DeviceContext->BeginDraw();
RenderMyVectorContent(pD2D1DeviceContext);
pD2D1DeviceContext->EndDraw();
//Drawing a command list to a bitmap target
pD2D1DeviceContext->SetTarget(pBitmap2);
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->DrawImage(pCommandList1);
pD2D1DeviceContext->EndDraw();
- ビットマップをターゲットとして設定します。この場合、ビットマップにレンダリングされるすべてのコンテンツがラスター化されます。 このビットマップが他の場所で使用されている場合、解像度に依存せず、 高品質スケール などの変換を使用した場合、忠実度は維持されません。
- コマンド リストをターゲットとして設定します。この場合、シーンがラスター化されるのではなく、すべてのコマンドが記録されます。 後で ID2D1DeviceContext::D rawImage を使用した画面描画にコマンド リストを使用するか、XPS 印刷コントロールに渡すと、ベクター コンテンツは忠実性を失う必要なく再生されます。
- コマンド リストをビットマップ ターゲットに描画する:この場合、ターゲットはビットマップであるため、コマンド リストはビットマップに描画され、解像度に依存しません。
CommandList を使用してブラシを作成する
コマンド リストは、再生時に忠実性を維持できるため、パターン ブラシをサポートするのに適した方法です。 目的のパターンをコマンド リストとして格納できます。これを使用してイメージ ブラシを作成できます。 その後、このブラシを使用してパスを描画できます。コマンド リストでパスを埋めるのをサポートするブラシの種類は、 イメージ ブラシと呼ばれます。
次の psuedocode は、イメージ ブラシでコマンド リストを使用するプロセスを示しています。
//Draw the pattern to the command list
ID2D1CommandList *pCommandList;
pD2D1DeviceContext->SetTarget(pCommandList);
pD2D1DeviceContext->BeginDraw();
DrawMyPattern(pD2D1DeviceContext);
pD2D1DeviceContext->EndDraw();
//Create the image brush from the command list
ID2D1ImageBrush *pImageBrush;
pD2D1DeviceContext->CreateImageBrush(
pCommandList,
pImageBrushProperties,
pBrushProperties,
&pImageBrush);
//Fill the ellipse with the pattern brush
pD2D1DeviceContext->SetTarget(pTargetBitmap);
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->FillEllipse(pEllipse, pImageBrush);
pD2D1DeviceContext->EndDraw();
ブラシは画像を受け入れるので、次の他の利点もあります。
- 効果グラフの出力は画像であるため、このイメージを使用してイメージ ブラシを作成できます。これにより、効果を塗りつぶしとして使用する機能が効果的に提供されます。
- コマンド リストはイメージの一種であるため、ベクター コンテンツを効果グラフに挿入したり、タイル化したり操作したりすることもできます。 たとえば、大きな著作権情報を仮想化されたイメージを含むグラフ上に挿入し、エンコードすることができます。
互換性のあるレンダー ターゲットの置換として CommandList を使用する
互換性のあるレンダー ターゲットは、後で実際のシーンと合成される中間ビットマップへのオフスクリーン レンダリングに非常に頻繁に使用されます。 特に印刷の場合、互換性のあるレンダー ターゲットを使用すると、メモリ占有領域が増加します。これは、すべてがラスター化され、実際のプリミティブを保持するのではなく XPS に送信されるためです。 このシナリオでは、互換性のあるレンダー ターゲットを中間コマンド リストに置き換える方が開発者には適しています。 次の擬似コードは、この点を示しています。pD2D1Device->CreateDeviceContext(&pD2D1DeviceContext);
pRenderTarget->CreateCompatibleRenderTarget(…, &pCompatibleRenderTarget);
//render to the compatible render target
pCompatibleRenderTarget->BeginDraw();
RenderMyScene1(pCompatibleRenderTarget);
pCompatibleRenderTarget->EndDraw();
//get the bitmap from the compatible render target
pCompatibleRenderTarget->GetBitmap(pCompatBitmap);
//draw this bitmap on the device context
pD2D1DeviceContext->SetTarget(pTargetBitmap)
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->DrawBitmap(pCompatBitmap);
pD2D1DeviceContext->EndDraw();
//draw something else on the compatible render target
pCompatibleRenderTarget->BeginDraw();
pCompatibleRenderTarget->Clear();
pCompatibleRenderTarget>RenderScene2();
pCompatibleRenderTarget->EndDraw();
//get the bitmap from the compatible render target
pCompatibleRenderTarget->GetBitmap(pCompatBitmap);
//draw this bitmap on the device context
pD2D1DeviceContext->SetTarget(pTargetBitmap)
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->DrawBitmap(pCompatBitmap);
pD2D1DeviceContext->EndDraw();
//Use a command list instead for better quality and performance
//store the original target
pOriginalTarget = pD2D1DeviceContext->GetTarget();
pD2D1DeviceContext->CreateCommandList(pCommandList1);
//draw to command list 1
pD2D1DeviceContext->SetTarget(pCommandList1);
pD2D1DeviceContext->BeginDraw();
RenderMyScene1(pD2D1DeviceContext);
pD2D1DeviceContext->EndDraw();
//draw the command list to the original target
pD2D1DeviceContext->SetTarget(pOriginalTarget);
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->DrawImage(pCommandList1);
pD2D1DeviceContext->EndDraw();
pD2D1DeviceContext->CreateCommandList(pCommandList2);
//draw something else to a new command list
pD2D1DeviceContext->SetTarget(pCommandList2);
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->RenderScene2();
pD2D1DeviceContext->EndDraw();
//draw the new command list on the old command list
pD2D1DeviceContext->SetTarget(pCommandList1);
pD2D1DeviceContext->BeginDraw();
pD2D1DeviceContext->DrawImage(pCommandList2);
pD2D1DeviceContext->EndDraw();
他の API の操作
Direct2D では、GDI API と Direct3D/DXGI API との相互運用時に単純なモデルが採用されます。 コマンド リストには、これらのコマンドは記録されません。 代わりに、コンテンツを所定の場所にラスター化し、 ID2D1Bitmap として格納します。 コンテンツはラスター化されるため、これらの相互運用ポイントは高い忠実度を維持しません。Gdi: コマンド シンク インターフェイスは、Get/ReleaseDC() 呼び出しをサポートしていません。 ID2D1GdiInteropRenderTarget::ReleaseDC の呼び出しが行われると、Direct2D は更新されたリージョンの内容を D2D1Bitmap にレンダリングします。 これは、コピー複合モードでエイリアス化された DrawBitmap 呼び出しとして再生されます。 正しい DPI でビットマップをラスター化するには、コマンドの再生時に SetDPI() 関数を使用して設定された DPI 値が使用されます。 これは、 シンク が SetDPI() 呼び出しを尊重する唯一のケースです。
Dx: Direct3D はコマンド リストに直接レンダリングできません。 この場合、Direct3D コンテンツをレンダリングするために、アプリケーションは Direct3D サーフェスによってサポートされる ID2D1Bitmap を使用して DrawBitmap を呼び出すことができます。
要件
サポートされている最小のクライアント | Windows 8 および Windows 7 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2012 および Windows Server 2008 R2 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | d2d1_1.h |