次の方法で共有


ターゲット、デバイス、およびリソースのレンダリング

レンダー ターゲットは、プログラムが描画される場所です。 通常、レンダー ターゲットはウィンドウ (具体的には、ウィンドウのクライアント領域) です。 また、メモリ内のビットマップが表示されない場合もあります。 レンダー ターゲットは、ID2D1RenderTarget インターフェイスによって表されます。

デバイスは、実際にピクセルを描画するものを表す抽象化です。 ハードウェア デバイスは GPU を使用してパフォーマンスを向上させるのに対し、ソフトウェア デバイスでは CPU を使用します。 アプリケーションはデバイスを作成しません。 代わりに、アプリケーションがレンダー ターゲットを作成するときに、デバイスが暗黙的に作成されます。 各レンダー ターゲットは、特定のデバイス (ハードウェアまたはソフトウェア) に関連付けられます。

レンダー ターゲットとデバイスの関係を示す図。

リソースは、プログラムが描画に使用するオブジェクトです。 Direct2D で定義されているリソースの例をいくつか次に示します。

  • ブラシ。 線と領域の描画方法を制御します。 ブラシの種類には、純色ブラシとグラデーション ブラシが含まれます。
  • ストローク スタイル。 破線やソリッドなど、線の外観を制御します。
  • ジオメトリ 線と曲線のコレクションを表します。
  • メッシュ。 三角形から形成された図形。 メッシュ データは、レンダリングの前に変換する必要があるジオメトリ データとは異なり、GPU によって直接使用できます。

レンダー ターゲットは、リソースの一種とも見なされます。

一部のリソースは、ハードウェア アクセラレーションによる利点が得られます。 この種類のリソースは常に、ハードウェア (GPU) またはソフトウェア (CPU) のいずれかの特定のデバイスに関連付けられます。 この種類のリソースは、デバイス依存と呼ばれます。 ブラシとメッシュは、デバイスに依存するリソースの例です。 デバイスが使用できなくなった場合は、新しいデバイス用にリソースを再作成する必要があります。

その他のリソースは、使用されているデバイスに関係なく、CPU メモリに保持されます。 これらのリソースは、特定のデバイスに関連付けられていないため、 デバイスに依存しません。 デバイスが変更されたときに、デバイスに依存しないリソースを再作成する必要はありません。 ストロークのスタイルとジオメトリは、デバイスに依存しないリソースです。

各リソースの Windows ドキュメントには、リソースがデバイスに依存しているか、デバイスに依存しないかが記載されています。 すべてのリソースの種類は、ID2D1Resource から派生するインターフェイスによって表されます。 たとえば、ブラシは ID2D1Brush インターフェイスで表されます。

Direct2D ファクトリ オブジェクト

Direct2D を使用する場合の最初の手順は、Direct2D ファクトリ オブジェクトのインスタンスを作成することです。 コンピューター プログラミングでは、factory は他のオブジェクトを作成するオブジェクトです。 Direct2D ファクトリでは、次の種類のオブジェクトが作成されます。

  • レンダー対象。
  • ストロークのスタイルやジオメトリなどの、デバイスに依存しないリソースです。

ブラシやビットマップなどのデバイス依存リソースは、レンダー ターゲット オブジェクトによって作成されます。

direct2d ファクトリを示す図。

Direct2D ファクトリ オブジェクトを作成するには、D2D1CreateFactory 関数を呼び出します。

ID2D1Factory *pFactory = NULL;

HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);

最初のパラメーターは、作成オプションを指定するフラグです。 D2D1_FACTORY_TYPE_SINGLE_THREADED フラグは、複数のスレッドから Direct2D を呼び出さないことを意味します。 複数のスレッドからの呼び出しをサポートするには、D2D1_FACTORY_TYPE_MULTI_THREADED を指定します。 プログラムで 1 つのスレッドを使用して Direct2D を呼び出す場合、シングル スレッド オプションの方が効率的です。

D2D1CreateFactory 関数の 2 番目のパラメーターは、ID2D1Factory インターフェイスへのポインターを受け取ります。

最初の WM_PAINT メッセージの前に Direct2D ファクトリ オブジェクトを作成する必要があります。 WM_CREATE メッセージ ハンドラーは、ファクトリを作成するのに適した場所です。

    case WM_CREATE:
        if (FAILED(D2D1CreateFactory(
                D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory)))
        {
            return -1;  // Fail CreateWindowEx.
        }
        return 0;

Direct2D リソースの作成

Circle プログラムでは、次のデバイスに依存するリソースが使用されます。

  • このアプリケーション ウィンドウに関連付けられているレンダー ターゲット。
  • 円を塗りつぶす純色のブラシ。

これらの各リソースは、COM インターフェイスによって表されます。

Circle プログラムは、これらのインターフェイスへのポインターを、MainWindow クラスのメンバー変数として格納します。

ID2D1HwndRenderTarget   *pRenderTarget;
ID2D1SolidColorBrush    *pBrush;

次のコードでは、これら 2 つのリソースを作成します。

HRESULT MainWindow::CreateGraphicsResources()
{
    HRESULT hr = S_OK;
    if (pRenderTarget == NULL)
    {
        RECT rc;
        GetClientRect(m_hwnd, &rc);

        D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);

        hr = pFactory->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(),
            D2D1::HwndRenderTargetProperties(m_hwnd, size),
            &pRenderTarget);

        if (SUCCEEDED(hr))
        {
            const D2D1_COLOR_F color = D2D1::ColorF(1.0f, 1.0f, 0);
            hr = pRenderTarget->CreateSolidColorBrush(color, &pBrush);

            if (SUCCEEDED(hr))
            {
                CalculateLayout();
            }
        }
    }
    return hr;
}

ウィンドウのレンダー ターゲットを作成するには、Direct2D ファクトリで ID2D1Factory::CreateHwndRenderTarget メソッドを呼び出します。

  • 最初のパラメーターは、任意の種類のレンダー ターゲットに共通するオプションを指定します。 ここでは、ヘルパー関数 D2D1::RenderTargetProperties を呼び出して、既定のオプションを渡します。
  • 2 番目のパラメーターは、ウィンドウへのハンドルとレンダー ターゲットのサイズをピクセル単位で指定します。
  • 3 番目のパラメーターは、ID2D1HwndRenderTarget ポインターを受け取ります。

純色ブラシを作成するには、レンダー ターゲットで ID2D1RenderTarget::CreateSolidColorBrush メソッドを呼び出します。 色は D2D1_COLOR_F 値として指定されます。 Direct2D の色の詳細については、「 Direct2D での色の使用」を参照してください。

また、レンダー ターゲットが既に存在する場合、CreateGraphicsResources メソッドは何もせずに S_OK を返します。 この設計の理由は、次のトピックで明らかになります。

次へ

Direct2D での描画