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

関連項目

コマンド リスト

ID2D1Bitmap

ID2D1Image

印刷とコマンド リスト