次の方法で共有


PDC 2008

Direct2D の紹介

更新日: 2009 年 4 月 28 日


ダウンロード

PDC08_Introducing_Direct2D_JPN.docx (Word 形式、101 KB)


目次:

  1. はじめに
  2. Direct2D の概要
    1. 最大限の可用性を備えた高い性能
    2. 画質
    3. 相互運用性
  1. Direct2D API
    1. レンダー ターゲット
    2. ジオメトリ
    3. ビットマップとテキスト
  2. まとめ



Kam VedBrat
Microsoft Corporation
2008 年 10 月

対象:

Windows® 7

要約:

Windows 7 の新しい API である、Microsoft Direct2D について紹介します。Direct2D は、Win32 開発者が 2D グラフィックスのレンダリングをこれまで以上に高い性能と画質で実行するための機能を提供します。

法的通知:

このドキュメントは暫定版であり、このソフトウェアの最終的な製品版の発売時に実質的に変更されることがあります。
このドキュメントに記載されている情報は、このドキュメントの発行時点におけるマイクロソフトの見解を反映したものです。変化する市場状況に対応する必要があるため、このドキュメントは、記載された内容の実現に関するマイクロソフトの確約とはみなされないものとします。また、発行以降に発表される情報の正確性に関して、マイクロソフトはいかなる保証もいたしません。
このホワイト ペーパーに記載された内容は情報の提供のみを目的としており、明示、黙示または法律の規定にかかわらず、これらの情報についてマイクロソフトはいかなる責任も負わないものとします。
お客様ご自身の責任において、 適用されるすべての著作権関連法規に従ったご使用を願います。このドキュメントのいかなる部分も、米国 Microsoft Corporation の書面による許諾を受けることなく、その目的を問わず、どのような形態であっても、複製または譲渡することは禁じられています。ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての手段を含みます。ただしこれは、著作権法上のお客様の権利を制限するものではありません。
マイクロソフトは、このドキュメントに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の無体財産権を有する場合があります。別途マイクロソフトのライセンス契約上に明示の規定のない限り、このドキュメントはこれらの特許、商標、著作権、またはその他の無体財産権をお客様に許諾するものではありません。
© 2008 Microsoft Corporation. All rights reserved.
Microsoft、MS-DOS、Windows、Windows NT、Windows Server、Windows Vista、Active Directory、ActiveSync、ActiveX、Direct3D、DirectDraw、DirectInput、DirectMusic、DirectPlay、DirectShow、DirectSound、DirectX、Expression、FrontPage、HighMAT、Internet Explorer、JScript、Microsoft Press、MSN、Outlook、PowerPoint、SideShow、Silverlight、Visual Basic、Visual C++、Visual InterDev、Visual J++、Visual Studio、WebTV、Windows Media、Win32、Win32s、および Zune は米国 Microsoft Corporation の米国またはその他の国における登録商標または商標です。
記載されている会社名、製品名には、各社の商標のものもあります。


1. はじめに

Microsoft® Windows® で新しい 2D グラフィックス API を作成した背景には主に以下の 3 つの動機があります。Windows ユーザーが慣れ親しんでいる視覚的効果が急速に高水準化している現状に対応すること、API が実行されるコンピューターのグラフィック ハードウェアに合わせて調整される 2D レンダリング コードを開発者が記述できるようにすること、サービスのコンテキストで実行できる 2D グラフィックスをレンダリングするコードを開発者が記述できるようにすること、の 3 つです。

近年、デジタル エクスペリエンスにおける視覚的要素の品質に対するエンドユーザーの期待は急激に高まっています。この傾向は家庭用電化製品にはっきりと表れています。たとえば、GPS 機器、各種メディア再生機器、携帯電話、デジタルカメラなどの製品では、年々高水準のエクスペリエンスが提供されるようになっています。この傾向はまた、映画、テレビ、ビデオ ゲーム、Web で使用されているグラフィックスの内容の多様化にも見て取ることができます。この変化のスピードに対応するため、開発者は、常に既存の Windows アプリケーションの視覚的な品質を次のレベルに高めることを要求されています。

Windows Media Center や Aero® のような Windows エクスペリエンスの進化に加えビデオ ゲーム グラフィックスの進化によって、近年の Windows 搭載コンピューターのグラフィックス処理機能は着実に進化し続けています。Windows アプリケーションの中には、Microsoft Direct3D® や Windows Presentation Foundation (WPF) を使用した最新の GPU を活用できるものもあります。Direct3D がハイエンドな 3D グラフィックス アプリケーションを支え、WPF が .NET 開発者のニーズに応える一方で、GDI や GDI+ ベースのレンダリング コードの大規模なコードベースを抱えている開発者や、高品質な 2D グラフィックスを Direct3D ベースのアプリケーションに統合したいと考えている開発者にとっては、カバーされていない領域があります。

そして、サービス コンテキストで使用できるグラフィックス API が、企業や Web 開発シナリオに従事する開発者にとって新たな必須要件となっています。既存のレンダリング API は、単一ユーザー セッションにおけるクライアント側のレンダリングに重点を置いています。このため、サービス コンテキストで使用すると、堅牢性や拡張性という部分が十分ではない場合があります。そのため、新しい API では堅牢性と拡張性を満たす必要がありました。

ページのトップへ


2. Direct2D の概要

Direct2D は、ハードウェア アクセラレータ、イミディエイト モードの 2D グラフィックス用 API で、2D のジオメトリ、ビットマップ、テキストのレンダリングで高い性能と品質を発揮します。Direct2D API は、GDI、GDI+、または Direct3D を使用した既存のコードと相互運用できるように設計されています。

また、主に以下のクラスに該当する開発者による使用を想定して設計されています。

  • Microsoft Office® のような、大規模で企業レベルのネイティブ アプリケーションの開発者
  • 下流工程に携わる開発者が使用するツールキットやライブラリを作成する独立系ソフトウェア開発企業 (ISV) の開発者
  • 2D グラフィックスのレンダリングをサーバー側で行う必要がある開発者
  • 主に Direct3D を使用しているが、メニュー、ユーザー インターフェイス要素、警告表示にシンプルで高性能な 2D またはテキストのレンダリングを使用する必要がある開発者

a. 最大限の可用性を備えた高い性能

Direct2D は Direct3D® 10.1 API を使用して作成されたユーザー モード ライブラリとして実装されます。このため、Direct2D アプリケーションは現在主流の GPU でのハードウェア アクセラレータのレンダリングによるメリットを享受できます。ハードウェア アクセラレータは、Direct3D 10 Level 9 レンダリングを使用した旧バージョンの Direct3D 9 ハードウェアでも実現できます。この組み合わせは、既存の Windows® のコンピューターに搭載されている大多数のグラフィックス ハードウェアですばらしい性能を発揮します。

ハードウェア アクセラレータの使用が不可能または望まれないシナリオでは、Direct2D に用意されている高性能なソフトウェア ラスタライザーを使用できます。ソフトウェアでのレンダリングにおいて、Direct2D を使用しているアプリケーションは、GDI+ を使用している場合に比べて、圧倒的にレンダリングのパフォーマンスが高くなります。ソフトウェア ラスタライザーもサービス コンテキストでの使用に対応するように設計されています。

Direct2D でレンダリングされたコンテンツは、Windows 7 オペレーティング システムのリモート デスクトップ プロトコル (RDP) インフラストラクチャを使用すると、リモートで表示することができます。この際、開発者は、レンダリングを、コンテンツを表示するコンピューターの GPU で処理するか、ローカルで処理したものをビットマップ形式で送信するかを選択できます。これは、レンダリングされるコンテンツのフィル レートとプリミティブのカウント特性に基づいて決定することができます。コンテンツを表示するコンピューターで Windows 7 以前のオペレーティング システムで実行されている場合、リモート表示のレンダリングは、ネットワーク経由でビットマップ情報を送信することで実現されます。

Direct3D の性能と、ソフトウェア フォールバック、リモート デスクトップ、およびサービス レンダリングによる高可用性を兼ね備えた 1 つの API が用意されているので、開発者は、Direct2D を使用して多くのシナリオで高性能のレンダリングを行うことができます。

Direct2D のアーキテクチャ階層
Direct2D のアーキテクチャ階層

b. 画質

グラフィックスに Direct2D を使用したアプリケーションでは、GDI を使用して安易に実現される画質よりもずっと高品質なグラフィックスを提供できます。Direct2D では、プリミティブ単位のアンチエイリアス表示を使用し、レンダリングしたコンテンツで今まで以上に滑らかな直線と曲線を表現します。また、2D プリミティブのレンダリングでは、透明色とアルファ ブレンドが完全にサポートされています。

エイリアス表示とアンチエイリアス表示による直線および曲線
エイリアス表示とアンチエイリアス表示による直線および曲線

開発者は、必要に応じて、ベクター グラフィックスのエイリアス表示レンダリングを指定することもできます。これは、ポインターやルーラーといったユーザー インターフェイス要素などのように、ピクセルの境界線を正確に合わせる必要がある場合、GDI による出力のスタイルに合わせる必要がある場合、または MSAA などのメカニズムでレンダリング プロセスの下流工程でアンチエイリアス表示が行われる場合などに使用できます。

c. 相互運用性

GDI や Direct3D とのサーフェス レベルでの相互運用性を備えているため、開発者は、容易に Direct2D ベースのレンダリングを統合することができます。主に GDI、GDI+、および Direct3D を使ってコンテンツをレンダリングするアプリケーションについては、まずアプリケーションの特定の範囲を Direct2D でレンダリングすることから始めて、徐々に Direct2D を主要なレンダリング API にするモデルへと移行することができます。この際、プラグインとレガシの機能拡張には、主に GDI を使用します。

ページのトップへ


3. Direct2D API

Direct2D は Direct3D® と同様、C または C++ と組み合わせて使用することができます。API では下記のような機能を公開します。

  • Direct2D、Direct3D、または GDI を使用した、画面表示用およびオフスクリーン レンダリング用のレンダー ターゲット
  • 座標空間の変形やエイリアス表示モードなどの描画状態を管理するオブジェクト
  • ジオメトリ データの表示およびジオメトリ処理機能
  • ビットマップ、ジオメトリ、およびテキストのレンダリング機能
  • レンダリングに使用するリソース (ブラシなど)
  • GDI や Direct3D を使用して作成されたグラフィック コンテンツの提供

Direct2D の機能にアクセスするには、ID2D1Factory インターフェイスを使用する必要があります。ID2D1Factory インターフェイスは、レンダー ターゲット、描画状態を表すオブジェクト、およびジオメトリ データとして形状を表すオブジェクトを作成する際に使用されます。

a. レンダー ターゲット

レンダー ターゲットは描画を行うためのリソースを作成し、実際に描画操作を実行するために使用されます。レンダー ターゲットには複数の種類があり、さまざまな目的のために作成することが可能です。ID2D1RenderTarget インターフェイスは、レンダリングの基本ベース インターフェイスです。以下に、ID2D1RenderTarget インターフェイスから派生し、それぞれ異なった方法でグラフィックスをレンダリングするインターフェイスを示します。

  • ID2D1HwndRenderTarget インターフェイスではコンテンツを HWND にレンダリングします。
  • ID2D1DCRenderTarget は GDI デバイス コンテキストに描画するためのインターフェイスです。
  • ビットマップ レンダー ターゲットは、WIC や DXGI で使用したり、D2D ビットマップ リソースとして使用するために、コンテンツをオフスクリーン ビットマップにレンダリングします。
  • DXGI サーフェスへのレンダリングを行う ID2D1RenderTarget インターフェイスは CreateDxgiSurfaceRenderTarget を使用して作成できます。

レンダー ターゲットは相互に互換性がある新しいレンダー ターゲットを作成することができます。これは、元のレンダー ターゲットに設定されたさまざまなプロパティを保持ながら、中間オフスクリーン レンダリングを行う際に有効です。

レンダー ターゲットには、ハードウェア アクセラレータやリモート表示に関する既定の動作があります。開発者は、レンダー ターゲットで行われるレンダリングがハードウェア アクセラレータを使用して行われるかどうかを定義したり、リモート表示のレンダリングがローカル コンピューターとリモート コンピューターのどちらで行われるのかを定義したりすることができます。レンダー ターゲットは、エイリアス表示またはアンチエイリアス表示のいずれかで設定できます。多数のプリミティブを含むレンダリングの場合、開発者は 2D グラフィックスをエイリアス表示モードでレンダリングし、D3D の MSAA を使用して拡張性を高めることもできます。

レンダー ターゲットでは、描画操作を ID2D1Layer インターフェイスで表される階層に分類することもできます。この階層は、フレームのレンダリングで行われる一連の描画操作をまとめるのに役立ちます。このような階層を使用すると、アロケーションのコストを ID2D1BitmapRenderTarget を使用する場合よりも大幅に抑えることができるので、ビットマップのレンダー ターゲットにレンダリングしてからビットマップのコンテンツを再利用する方法の代替手段として有効です。

IGdiInteropRenderTarget のレンダー ターゲットで QueryInterface を呼び出すことによって、Direct2D レンダー ターゲットで GDI を使用してコンテンツを表示することができます (IGdiInteropRenderTarget には、GDI デバイス コンテンツを取得するのに使用できる GetDC メソッドと ReleaseDC メソッドが定義されています)。ただし、GDI によるレンダリングを行えるのは、D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE フラグが設定された状態でレンダリング ターゲットが作成された場合に限ります。このレンダリングが有効なのは、アプリケーションが主に Direct2D でレンダリングされているが、拡張モデルがある場合や、GDI でのレンダリングが必要なレガシーコンテンツがある場合です。

b. ジオメトリ

ジオメトリを表現するデータは、ID2D1Geometry インターフェイスを使って処理されます。Direct2D には単純なジオメトリから複雑なジオメトリまで、さまざまなジオメトリを表現できるインターフェイスが用意されています。ファクトリでは、長方形、角丸四角形、楕円形を表現するオブジェクトを作成するメソッドを公開します。より複雑なジオメトリは ID2D1GeometrySink インターフェイスで一連の図形を定義することで作成できます。ID2D1PathGeometry インターフェイスの Open メソッドに ID2D1GeometrySink インターフェイスが渡されて複雑なジオメトリが生成されます。ID2D1GeometrySink インターフェイスは DirectWrite API と併用することが可能で、書式設定されたテキストのパスのアウトラインを抽出して、芸術的描画を実現します。

ID2D1Geometry オブジェクトでは、さまざまな目的のための一連のジオメトリ操作が公開されています。既存のジオメトリを単純化したり、幅を広げたり、複数のジオメトリを交差させたり、結合したりすることで新しいジオメトリを作成するメソッドが用意されています。また、ジオメトリが交差していたり重なっていたりしないかを判断したり、境界線情報を取得したり、ジオメトリの長さや面積を測定したり、ジオメトリに隣接する位置を補間したりするなど、分析を行うメソッドも利用できます。さらに Direct2D にはジオメトリから派生した網状の三角形を作成する機能も備わっています。

必要なジオメトリを作成したら、DrawGeometry メソッドや FillGeometry メソッドを使ってレンダリングできます。

c. ビットマップとテキスト

Direct2D には Windows Imaging Component (WIC) を使用してビットマップ オブジェクトを作成し、DirectWrite を使用して書式設定されたテキスト オブジェクトを作成する機能が用意されています。

ビットマップ リソースは、WIC を使用して読み込まれ、ID2D1RenderTarget インターフェイスの CreateBitmapFromWicBitmap メソッドを使用して ID2DBitmap を作成するために使われます。ビットマップは、別の手段で設定されたメモリ内データから作成することも可能です。作成したビットマップは、レンダー ターゲットの DrawBitmap メソッドかビットマップ ブラシを使用して描画できます。

ハードウェアのレンダー ターゲットにビットマップ リソースを作成する操作には高い負荷がかかるため、Direct2D では、ID2DBitmap の CopyFromBitmap、CopyFromRenderTarget、および CopyFromMemory メソッドを使用してビットマップ (またはビットマップの一部) のコンテンツを更新できるようにしています。この方法を使用すると、GPU テクスチャの追加アロケーションに関わる負荷を削減できることがあります。

レンダー ターゲットには、DrawText、DrawTextLayout、および DrawGlyphRun という Direct2D でテキストを描画する 3 つのメソッドが用意されています。DrawText メソッドは、最小限の書式で Unicode テキストの文字列をレンダリングする処理を伴う、ごく単純なシナリオで使用します。IDWriteTextLayout オブジェクトを入力パラメーターとして受け取り、レンダリングするコンテンツと書式を定義する、DrawTextLayout メソッドを使用すると、より複雑で多用なレイアウトや字体を表現できます。グリフ レベルのレイアウトで正確な制御が必要なシナリオでは、DirectWrite に用意されている測定機能と併せて DrawGlyphRun メソッドを使用できます。

Direct2D の各描画 API で使用されている共有のグリフをレンダリングするインフラストラクチャは、GDI のものよりも優れた性能を備えています。Direct2D では GPU を ClearType® テキスト レンダリング プロセスで使用し、GDI よりも CPU 使用率を低く抑えながら同様の処理を実現しています。また、GPU 処理能力が高まるため、GDI よりも高い拡張性を得ることができます。

ページのトップへ


4. まとめ

Microsoft® Direct2D® を使用すると、開発者は、アプリケーションで GDI を使用した場合よりも高品質で最新の GPU に合わせて拡張する機能を備えた 2D グラフィックスを作成することができます。また、Direct2D の相互運用モデルにより、GDI、GDI+、または Direct3D ベースのレンダリングを使用しながら、アプリケーションの一部を徐々に Direct2D 移行することができます。

詳細については、Windows 7 および .NET Framework 3.5 Service Pack 1 用 Windows® ソフトウェア開発キット (SDK) を参照してください。プレベータ版は、PDC 参加者と PDC 2008 実習の参加者に配布しました。

ページのトップへ