Direct2D API の概要

Direct2D には、C または C++ で使用するための Direct3D と同様の API が用意されています。 API では、さまざまな描画関連の機能が公開されています。

  • Direct2D、Direct3D、または GDI を使用して、表示および画面外レンダリングのターゲットをレンダリングします。
  • 座標空間変換やアンチエイリアシング モードなどの描画状態を管理するためのオブジェクト。
  • ジオメトリ データの表現、およびジオメトリ処理用の関数。
  • ビットマップ、ジオメトリ、テキストのレンダリング機能。
  • GDI または Direct3D を使用して作成されたグラフィカル コンテンツを使用するためのプロビジョニング。

このトピックでは、Direct2D API を構成するオブジェクトの概要について説明します。 次のセクションが含まれます。

Direct2D ヘッダー ファイル

Direct2D API は、次のヘッダー ファイルによって定義されます。

ヘッダー ファイル Description
d2d1.h プライマリ Direct2D API の C および C++ バージョンを定義します。
d2d1helper.h C++ ヘルパー関数、クラス、および構造体を定義します。
d2dbasetypes.h ポイントや四角形など、Direct2D の描画プリミティブを定義します。 このヘッダーは d2d1.h に含まれています。
d2derr.h Direct2D のエラー コードを定義します。 このヘッダーは d2d1.h に含まれています。
d2d1_1.h Windows 8 以降のプライマリ Direct2D API の C および C++ バージョンを定義します。
d2d1_1helper.h Windows 8 以降の C++ ヘルパー関数、クラス、および構造体を定義します。
d2d1effects.h Windows 8 以降の Direct2D API のイメージ効果部分の C および C++ バージョンを定義します。
d2d1effecthelpers.h Windows 8 以降の Direct2D API のイメージ効果部分の C++ ヘルパー関数、クラス、および構造体を定義します。

 

Direct2D を使用するには、アプリケーションに d2d1.h ヘッダー ファイルを含める必要があります。

Direct2D アプリケーションをコンパイルするには、ライブラリの一覧に d2d1.lib を追加します。 d2d1.h と d2d1.lib は 、Windows 7 用 Windows ソフトウェア開発キット (SDK) にあります。

次のセクションでは、Direct2D API によって提供される一般的なインターフェイスの一部について説明します。

Direct2D インターフェイス

Direct2D API のルートには、 ID2D1Factory インターフェイスと ID2D1Resource インターフェイスがありますID2D1Factory オブジェクトは、ID2D1Resource オブジェクトを作成し、Direct2D を使用するための開始点として機能します。 その他のすべての Direct2D オブジェクトは 、ID2D1Resource インターフェイスから継承されます。 Direct2D リソースには、デバイスに依存しないリソースとデバイスに依存するリソースの 2 種類があります。

  • デバイスに依存しないリソースは、特定のレンダリング デバイスに関連付けられていないため、アプリケーションの有効期間を維持できます。
  • デバイスに依存するリソースは、特定のレンダリング デバイスに関連付けられているので、そのデバイスが削除されると機能しなくなります。

(リソースとリソース共有の詳細については、「 リソースの概要」を参照してください)。

ID2D1Factory インターフェイス

ID2D1Factory インターフェイスは、Direct2D を使用するための開始点です。 ID2D1Factory を使用して Direct2D リソースをインスタンス化します。 ID2D1Factory を作成するには、 CreateFactory メソッドのいずれかを使用します。

ファクトリは、次の描画リソースを生成できる CreateResource メソッドのセットを定義します。

  • レンダー ターゲットは、描画コマンドをレンダリングするオブジェクトです。
  • 描画状態ブロックは、現在の変換やアンチエイリアシング モードなどの描画状態情報を格納するオブジェクトです。
  • ジオメトリは、単純で複雑な可能性のある図形を表すオブジェクトです。

ファクトリで作成できる最も便利なオブジェクトの 1 つは、次のセクションで説明する ID2D1RenderTarget です。

レンダー ターゲット

レンダー ターゲットは、 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 を取得します。

描画リソース

次のセクションでは、レンダー ターゲットインターフェイスとファクトリ インターフェイスで作成できるリソースの一部について説明します。

ブラシ

ID2D1Brush インターフェイスで表されるブラシは、レンダー ターゲットによって作成されたデバイス依存リソースであり、出力で領域を描画します。 ブラシが異なれば、出力の種類も異なります。 一部のブラシは、単色で領域を塗りつぶし、他のブラシはグラデーションまたはイメージで塗りつぶします。 Direct2D には、次の 4 種類のブラシが用意されています。

  • ID2D1SolidColorBrush は、領域を純色で塗りつぶします。
  • ID2D1LinearGradientBrush は、線全体に 2 つ以上の色 (グラデーション軸) をブレンドする線形グラデーションで領域を描画します。
  • ID2D1RadialGradientBrush は、楕円の周囲に 2 つ以上の色をブレンドする放射状グラデーションで領域を描画します。
  • ID2D1BitmapBrush は、ビットマップで領域を描画します。

ブラシを作成するには、CreateRadialGradientBrush などの ID2D1RenderTarget::Create*<Type>*Brush メソッドのいずれかを使用します。 ブラシは、レンダー ターゲットの Draw メソッドと Fill メソッドと共に使用して、図形のストロークまたはアウトラインを描画したり、不透明度マスクとして使用したりできます。

ブラシの詳細については、「ブラシの 概要」を参照してください。

ジオメトリ

Direct2D には、ポイント、四角形、楕円などの基本的な描画プリミティブに加えて、単純で複雑な図形を記述するための ID2D1Geometry インターフェイスが用意されています。 ID2D1Geometry から継承するインターフェイスは、四角形を表す ID2D1RectangleGeometry、丸い四角形を表す ID2D1RoundedRectangleGeometry、楕円を表す ID2D1EllipseGeometry など、さまざまな種類の図形を定義します。

より複雑な図形を作成するには、 ID2D1GeometrySink インターフェイスを使用して、線、曲線、円弧で構成される一連の図形を指定します。 ID2D1GeometrySink は、複雑なジオメトリを生成するために ID2D1PathGeometry の Open メソッドに渡されます。 ID2D1SimplifiedGeometrySink は、DirectWrite API と共に使用して、芸術的なレンダリングのために書式設定されたテキストのパス アウトラインを抽出することもできます。

ジオメトリ インターフェイスは、既存のジオメトリを拡大または簡略化するか、複数のジオメトリの交差または和集合を生成することによって、図形を操作するためのメソッドを提供します。 また、ジオメトリが交差しているか重複しているかを判断する方法、境界情報を取得する方法、ジオメトリの面積または長さを計算する方法、ジオメトリに沿って位置を補間するメソッドも用意されています。 Direct2D では、ジオメトリからテセレーションされた三角形のメッシュを作成することもできます。

ジオメトリを作成するには、CreatePathGeometry などの ID2D1Factory::Create*Type>*<Geometry メソッドのいずれかを使用します。 geometry は、デバイスに依存しないリソースです。

ジオメトリをレンダリングするには、レンダー ターゲットの DrawGeometry メソッドと FillGeometry メソッドを使用します。

ジオメトリの詳細については、「ジオメトリの概要」 参照してください。

ビットマップ

Direct2D には、ビットマップを読み込んだり保存したりするためのメソッドは用意されていません。代わりに、 Windows イメージング コンポーネント (WIC) を使用してビットマップを作成できます。 ビットマップ リソースは WIC を使用して読み込み、ID2D1RenderTarget::CreateBitmapFromWicBitmap メソッドを使用して ID2D1Bitmap を作成するために使用できます。

ビットマップは、他の方法で設定されたメモリ内データから作成することもできます。 ビットマップを作成した後は、レンダー ターゲット の DrawBitmap メソッドまたはビットマップ ブラシを使用して描画できます。

ハードウェア レンダー ターゲットにビットマップ リソースを作成することは多くの場合、負荷の高い操作であるため、Direct2D では 、CopyFromBitmapCopyFromRenderTarget、および CopyFromMemory メソッドを使用して、ビットマップ (またはビットマップの一部) の内容を更新できます。 これらの方法を使用すると、追加の GPU テクスチャ割り当てに関連するコストを節約できる可能性があります。

テキストの描画

Direct2D は、新しいテキスト API のテキスト操作 (DirectWrite) を操作するように設計されています。 DirectWrite API を使用しやすくするために、レンダー ターゲットには、テキスト リソースDirectWriteレンダリングするための 3 つのメソッド (DrawTextDrawTextLayoutDrawGlyphRun) が用意されています。 Direct2D は ClearType テキスト レンダリング プロセスに GPU を使用するため、Direct2D はテキスト操作に GDI よりも CPU 使用率が低く、GPU 処理能力が向上するためスケーラビリティが向上します。

ID2D1RenderTarget::D rawText は、最小限の書式設定で Unicode テキストの文字列をレンダリングする最も簡単なシナリオ用に設計されています。 より複雑なレイアウトと文字体裁の柔軟性は 、ID2D1RenderTarget::D rawTextLayout メソッドを使用して提供されます。このメソッドでは、 IDWriteTextLayout オブジェクトを使用して、レンダリングするコンテンツと書式設定を指定します。 IDWriteTextLayout を使用すると、テキストの部分文字列やその他の高度な文字体裁オプションに個別の書式を指定できます。

グリフ レベルのレイアウトを正確に制御する必要があるシナリオでは、ID2D1RenderTarget::D rawGlyphRun メソッドを、DirectWriteが提供する測定機能と組み合わせて使用できます。

DirectWrite API を使用するには、dwrite.h ヘッダーを含めます。 Direct2D と同様に、DirectWriteではファクトリ IDWriteFactory を使用してテキスト オブジェクトを作成します。 DWriteCreateFactory 関数を使用してファクトリを作成し、Create メソッドを使用してDirectWriteリソース (IDWriteTextFormat など) を作成します。

DirectWriteの詳細については、「DirectWriteの概要」トピックを参照してください。

Direct2D プリミティブ

Direct2D は、他の描画 API で提供されるものと似たプリミティブのセットを定義します。 色構造、変換を実行するためのマトリックス構造、ポイント、四角形、楕円、およびサイズ構造の浮動小数点および整数バージョンを提供します。 通常、これらの構造体の浮動小数点バージョンを使用します。

ファクトリまたはレンダー ターゲットを使用して Direct2D プリミティブをインスタンス化することはありません。 直接作成することも、d2d1helper.h で定義されているヘルパー メソッドを使用して作成することもできます。

Direct2D リファレンス

HelloWorld のDirectWrite

DirectWriteの概要

リソースの概要

Windows Imaging Component (WIC)