Share via


レンダー ターゲットの概要

レンダー ターゲットは、 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;
}

この例では、コードは省略されています。