レンダー ターゲットは、 ID2D1RenderTarget インターフェイスから継承するリソースです。 レンダー ターゲットは、描画用のリソースを作成し、実際の描画操作を実行します。 このトピックでは、さまざまな種類の Direct2D レンダー ターゲットとその使用方法について説明します。
レンダー ターゲット
レンダー ターゲットは、 ID2D1RenderTarget インターフェイスから継承するリソースです。 レンダー ターゲットは、描画用のリソースを作成し、実際の描画操作を実行します。 次の方法でグラフィックスをレンダリングするために使用できるレンダー ターゲットには、いくつかの種類があります。
- ID2D1HwndRenderTarget オブジェクトは、ウィンドウにコンテンツをレンダリングします。
- ID2D1DCRenderTarget オブジェクトは、GDI デバイス コンテキストにレンダリングされます。
- ビットマップ レンダー ターゲット オブジェクトは、コンテンツをオフスクリーン ビットマップにレンダリングします。
- DXGI レンダー ターゲット オブジェクトは、Direct3D で使用するために DXGI サーフェスにレンダリングされます。
レンダー ターゲットは特定のレンダリング デバイスに関連付けられているため、デバイスに依存するリソースであり、デバイスが削除されると機能しなくなります。
レンダーターゲット・機能
レンダー ターゲットでハードウェア アクセラレーションを使用するかどうか、およびリモート ディスプレイをローカル コンピューターとリモート コンピューターのどちらでレンダリングするかを指定できます。 レンダリングターゲットは、エイリアスレンダリングまたはアンチエイリアスレンダリングを行うために設定できます。 多数のプリミティブを含むシーンをレンダリングする場合、開発者はエイリアスモードで 2-D グラフィックスをレンダリングし、D3D マルチサンプル アンチエイリアシングを使用してスケーラビリティを向上させることもできます。
レンダー ターゲットでは、描画操作を ID2D1Layer インターフェイスで表されるレイヤーにグループ化することもできます。 レイヤーは、フレームをレンダリングするときに合成する描画操作を収集するのに役立ちます。 一部のシナリオでは、レイヤー化の割り当てコストが ID2D1BitmapRenderTarget よりも小さいため、これはビットマップ レンダー ターゲットにレンダリングしてからビットマップ コンテンツを再利用する代わりに役立ちます。
レンダー ターゲットは、それ自体と互換性のある新しいレンダー ターゲットを作成できます。これは、元のレンダー ターゲットに設定されたさまざまなレンダー ターゲット プロパティを保持しながら、中間のオフスクリーン レンダリングに役立ちます。
また、GDI デバイス コンテキストを取得するために使用できる GetDC メソッドと ReleaseDC メソッドを持つ ID2D1GdiInteropRenderTarget のレンダー ターゲットで QueryInterface を呼び出すことによって、Direct2D レンダー ターゲットで GDI を使用してレンダリングすることもできます。 GDI を使用したレンダリングは、レンダー ターゲットが D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE フラグを設定して作成された場合にのみ可能です。 これは、主に Direct2D を使用してレンダリングするが、GDI でレンダリングする機能を必要とする拡張性モデルまたはその他のレガシ コンテンツを持つアプリケーションに役立ちます。 詳細については、「 Direct2D と GDI 相互運用の概要」を参照してください。
ターゲット リソースのレンダリング
ファクトリと同様に、レンダー ターゲットは描画リソースを作成できます。 レンダー ターゲットによって作成されるすべてのリソースは、(レンダー ターゲットと同様に) デバイスに依存するリソースです。 レンダー ターゲットでは、次の種類のリソースを作成できます。
- ビットマップ
- ブラシ
- レイヤー
- メッシュ
描画コマンド
コンテンツをレンダリングするには、レンダー ターゲット描画メソッドを使用します。 描画を開始する前に、 ID2D1RenderTarget::BeginDraw メソッドを呼び出します。 描画が完了したら、 ID2D1RenderTarget::EndDraw メソッドを呼び出します。 これらの呼び出しの間に、Draw メソッドと Fill メソッドを使用して描画リソースをレンダリングします。 ほとんどの Draw メソッドと Fill メソッドは、図形 (プリミティブまたはジオメトリのいずれか) と、図形を塗りつぶしたりアウトライン表示したりするためのブラシを取ります。
レンダー ターゲットは、クリッピング、不透明度マスクの適用、座標空間の変換を行うメソッドを提供します。
Direct2D では左向きの座標系が使用されます。正の x 軸の値は右に進み、正の y 軸の値は下方向に進みます。
エラー処理
レンダー ターゲット描画コマンドは、要求された操作が成功したかどうかを示しません。 描画エラーがあるかどうかを調べるには、レンダー ターゲット の Flush メソッドまたは EndDraw メソッドを呼び出して HRESULT を取得します。
例: ウィンドウにコンテンツをレンダリングする
次の例では、 CreateHwndRenderTarget メソッドを使用して ID2D1HwndRenderTarget を作成します。
RECT rc;
GetClientRect(m_hwnd, &rc);
D2D1_SIZE_U size = D2D1::SizeU(
rc.right - rc.left,
rc.bottom - rc.top
);
// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(m_hwnd, size),
&m_pRenderTarget
);
次の例では、 ID2D1HwndRenderTarget を 使用してウィンドウにテキストを描画します。
// Called whenever the application needs to display the client
// window. This method writes "Hello, World"
//
// Note that this function will automatically discard device-specific
// resources if the Direct3D device disappears during function
// invocation, and will recreate the resources the next time it's
// invoked.
//
HRESULT DemoApp::OnRender()
{
HRESULT hr;
hr = CreateDeviceResources();
if (SUCCEEDED(hr))
{
static const WCHAR sc_helloWorld[] = L"Hello, World!";
// Retrieve the size of the render target.
D2D1_SIZE_F renderTargetSize = m_pRenderTarget->GetSize();
m_pRenderTarget->BeginDraw();
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
m_pRenderTarget->DrawText(
sc_helloWorld,
ARRAYSIZE(sc_helloWorld) - 1,
m_pTextFormat,
D2D1::RectF(0, 0, renderTargetSize.width, renderTargetSize.height),
m_pBlackBrush
);
hr = m_pRenderTarget->EndDraw();
if (hr == D2DERR_RECREATE_TARGET)
{
hr = S_OK;
DiscardDeviceResources();
}
}
return hr;
}
この例では、コードは省略されています。