Windows Vista のグラフィック API

XNA デベロッパー コネクション (XDC)、ソフトウェア デザイン エンジニア

XNA デベロッパー コネクション (XDC)

2008 年 3 月

Windows Vista には、Windows Driver Model (WDM) for Windows 98 の導入以降のビデオ ドライバーの設計における大きな改訂を示す、まったく新しいディスプレイ ドライバー モデルのサポートが組み込まれています。再設計されたこのモデルは、2D ラスター処理および GDI アプリケーションの世界から、固定機能のグラフィック ハードウェアを使用する 3D ゲームの世界、幅広い高性能グラフィック アプリケーションをサポートするプログラム可能な最新のグラフィック プロセッシング ユニット (GPU) の世界へのビデオ ハードウェアの進歩を表します。

背景

初期の Windows 以降におけるグラフィックのプログラミングの主要な API は、グラフィカル デバイス インターフェイス (GDI) でした。この API は、多数の 2D 出力デバイスを処理するように設計されており、Windows ユーザー インターフェイスの操作性の基盤となっていました。当時の既存のハードウェアの拡張として全画面ゲームおよび 3D レンダリングをサポートするために、DirectDraw および Direct3D が代替 API として導入されました。GDI とのやり取りは複雑で、従来の GDI 要素と Direct3D 要素との効果的な混用は、この設計によって制限されていました。XPDM と呼ばれる WDM の Windows XP バージョンは、GDI と Direct3D の並列性を表します (図 1 を参照してください)。

図形 1.  Windows XP のグラフィック API

Bb173477.Graphics_APIs_in_Windows_XP(ja-jp,VS.85).gif

長年をかけて、3D ビデオ カードの機能は、大半のハードウェアがこの機能に対応するところまで劇的に向上しました。新しいドライバー モデルである Windows Vista Display Driver Model (WDDM) は GPU および Direct3D を最先端へと導き、GDI の 2D の世界をプログラム可能な最新の GPU の機能とシームレスに融合する 3D デスクトップというまったく新しい体験の確立を可能にします。WDDM では、ビデオ ハードウェアは Direct3D によって完全に制御され、他のすべてのグラフィック インターフェイスは Direct3D 中心の新しいドライバー モデルを介してビデオ ハードウェアと通信します (図 2 を参照してください)。

図形 2.  Windows Vista のグラフィック API

Bb173477.Graphics_APIs_in_Windows_Vista(ja-jp,VS.85).gif

WDDM の詳細については、MSDN の Windows Vista Display Driver Model に関するページを参照してください。

Direct3D 9

DirectX Version 9 は最初、2002 年に Windows 向けにリリースされ、その後、2003 年と 2004 年に更新されました。この API は、DirectX テクノロジの 10 年間の進歩、Direct3D 向けのより強力なシェーダー プログラミング モデルの導入、および何千という製品版タイトルによって裏打ちされた成熟度を表します。Direct3D 9 は Windows Vista の主要なグラフィック インターフェイスで、依然として、幅広い既存のハードウェアや Windows リリースで実行する必要がある 3D ゲームおよびアプリケーションを作成するために使用する最適な API です。新しいドライバー モデルの詳細は、Direct3D 9 インターフェイスを使用するアプリケーションからは見えませんが、背後では、オペレーティング システムは、GPU の真のマルチタスキング、より効率的なリソース管理、および安定したパフォーマンスを実現するために新しい機能を最大限に利用しています。

古いバージョンの Windows との完全な互換性を確保するために、古いドライバー モデルの変わった特徴が Windows Vista の新しいディスプレイ ドライバー モデルでもエミュレートされる必要があります。たとえば、全画面アプリケーションは、フォーカスを失ったときに、ビデオ メモリー (VRAM) のすべてのリソースを失ったと想定し、アンマネージ リソースとして作成したものをリロードしなければなりません。ただし、新しいドライバー モデルでは、デバイス コンテキストから破棄せずに透過的にリソースを処理します。マネージおよびデフォルト リソース タイプという概念も、古いドライバー モデルに固有です。別の例として、使用可能な VRAM の量より多くアンマネージ (デフォルト プール) リソースを割り当てたときのエラーの予測があります。ただし、新しいドライバー モデルでは、ほとんど無限の量の仮想ビデオ メモリーを提供することができます。これらの要件が原因で、Windows Vista で実行中の Direct3D アプリケーションもこれらのエラー条件を受け取るため、基本的な Direct3D 9 インターフェイスを使用する新しいドライバー モデルの機能を最大限に利用できるわけではありません。

Windows Vista に付属している新しいシステムには WDDM ドライバーを搭載したビデオ カードが含まれることになっており、多数の一般的なビデオ カード用の新しいドライバーが同梱されていますが、Windows Vista では、アップグレードとコーポレート エディションのために古い XPDM ドライバーを引き続き使用することができます。古いドライバー モデルを使用するシステムでは、Direct3D 9 およびそれより古いインターフェイスを使用する必要があります。また、グラフィック システムの処理は Windows XP のもの (図 1) とよく似ています。アプリケーションで Direct3D 9Ex、Direct3D 10、およびそれ以降のバージョンを使用するには、WDDM が必要です。

Direct3D 9Ex

Direct3D 9Ex インターフェイスでは、仮想化リソースの割り当て、失われたデバイスの新しいセマンティクス、および Windows Vista で実行中に使用可能なその他の新しい機能を公開する標準の Direct3D 9 API の軽微な拡張へのアクセスを提供します。拡張されたこのオブジェクトを作成することによって、Direct3D 9 API は新しいセマンティクスを使用するので、アプリケーションではリソースの作成、管理、および新しい種類の条件のエラー処理に別のロジック (つまり別のコード パス) を使用する必要があります。この API は Windows Vista のみで使用可能で、WDDM ドライバーを必要とします。Direct3D 9Ex では Direct3D 9 とは別の API およびドライバー コード パスを使用するので、この API をサポートするには、アプリケーションの追加のテスト ケースが必要です。

新しい Direct3D 9Ex API を作成する主な理由は、既存の Direct3D アプリケーションの互換性を維持しながら、WDDM の新しい機能へのフル アクセスを可能にすることでした。新しい 3D デスクトップと Windows Vista 固有の多数のアプリケーションはこのバージョンの Direct3D 9 を使用しますが、古い XPDM ドライバーでの実行時には機能しません。Direct3D 9Ex API は、WDDM をサポートしていない古いバージョンの Windows には表示されないので、標準の Direct3D 9 インターフェイスの方がはるかに幅広いシステムに対応します。次世代のビデオ ハードウェアを利用できる高性能アプリケーションについては、まったく新しい Direct3D Version 10 によって、Direct3D 9Ex では公開されていない多数の新しい機能が提供されます。そのため、ゲームや他のほとんどのアプリケーションでは、Direct3D 9 または Direct3D 10 が推奨される API です。

    DirectX SDK では、Direct3D 9Ex インターフェイスのサンプル、ヘッダー、およびライブラリは提供されていません。MSDN ライブラリおよび Windows SDK (以前の Platform SDK) に、使用可能なドキュメント、ヘッダー、およびライブラリがあります。

Direct3D 9Ex の詳細については、MSDN の Windows Vista の DirectX に関するページを参照してください。

Direct3D 10

Windows Vista の新しいドライバー モデルおよび次世代のハードウェアの可能性を完全に実現するために、Direct3D API のまったく新しいバージョンが作成されました。WDDM によって、既存のグラフィック システムにおけるパフォーマンスのいくつかの制限がなくなる一方、Direct3D 10 によって、既存の Direct3D API の設計のボトルネックが取り除かれ、GPU のプログラミング作業が大幅に簡略化されます。

新しい API では、一部の固定機能を除くすべてを完全に排除して、プログラム可能なコンストラクトに置き換え、内部実装を大幅に合理化します。これまでのバージョンの Direct3D の何百という能力ビットが完全に排除され、特定のリソース フォーマットに対応した少数の任意の使用シナリオのみがある、明確に定義された包括的な機能セットに置き換えられています。新しい API には、CPU 負荷が大きいリソースの作成と検証の明示的なセマンティクスがあり、パフォーマンスの動作がはるかに予測可能になると共に、描画ごとのオーバーヘッドが大幅に減少します。個々のステージで効率的に使用できるようにリソースを複数のフォームに再構成することができ、機能セットによるフォーマットの使用シナリオに関する制限がはるかに少なくなります。新しいブロック圧縮法線マップ テクスチャー フォーマットもあります。

新しい API では、シェーダー定数とデバイス ステートは明示的なリソースなので、ハードウェアにおけるキャッシュがはるかに効率的になると共に、ドライバーの検証が大幅に簡略化されます。プログラム可能なシェーダー モデルは頂点シェーダーとピクセル シェーダーの両方で統一されており、明確に定義された計算モデルおよび演算子セットを使用してより適切に表現できるようになっています。また、頂点シェーダー ステージの後でプリミティブを処理するために、新しいジオメトリ シェーダー ステージが追加されています。パイプラインの頂点シェーダー ステージおよびジオメトリ シェーダー ステージにおける GPU の処理の結果を、再利用のためにビデオ RAM に出力することができ、最小限の CPU とのやり取りで非常に複雑なマルチパス GPU 処理が可能になります。

これらすべての機能強化によって、次世代のグラフィック テクノロジが有効になり、アプリケーションが GPU に処理を肩代わりさせる機能が拡張されます。処理を肩代わりさせることで、GPU ベースのより複雑なキャラクター スキニング、高速化されたモーフ テクニック、シャドウ ボリュームの生成および押し出し、完全に GPU ベースのパーティクルおよび物理計算システム、効率的な大きい描画バッチに結合されたより複雑なマテリアル、プロシージャの詳細な記述、リアルタイムのレイ トレース ディスプレースメント マッピング、単一パス キューブ マップの生成、さらに多くのテクニックが可能になる一方で、より複雑なアプリケーションのために CPU リソースが解放されます。

Direct3D 10 におけるこのレベルの新技術を実現するために、古いハードウェアを新しいインターフェイスの部分的な実装として表すことはできません。ビデオ カードは新しい機能をすべてサポートできるか、Direct3D 10 対応のカードでないかのどちらかです。そのため、Direct3D 9 では、多数の能力ビットが欠如していると共に使用制限がある DirectX7 時代のハードウェアを制御することができますが、Direct3D 10 は新世代のビデオ カードのみで機能します。アプリケーションが古いビデオ ハードウェアをサポートするには、Direct3D 9 インターフェイスをサポートしている必要があります。Direct3D の今後のバージョンは Version 10 を基盤にし、Direct3D 10 機能の厳密なスーパーセットを保持しながら、Version 10 を新しいバージョンの API へと拡張します。

Direct3D 10 の詳細については、DirectX 10 の DirectX SDK ドキュメントを参照してください。

Direct3D 10.1

Windows Vista Service Pack 1 では、Direct3D 10 API が Direct3D 10.1 で拡張され、Direct3D 10.1 をサポートするビデオ カードの新しいハードウェア機能をサポートするために、任意のインターフェイスと追加のシェーダー モデルが追加されています。Direct3D 10.1 をサポートできるハードウェアはすべて、Direct3D 10 のすべての機能も完全にサポートするので、ゲーム開発者は、使用可能であれば、Direct3D 10.1 の追加機能を利用することができます。

OpenGL

Windows Vista では、OpenGL について Windows XP と同じサポートを提供しており、ビデオ カード メーカーは、ハードウェアで高速化されたサポートを実現する OpenGL のインストール可能なクライアント ドライバー (ICD) を提供することができます。Windows Vista を完全にサポートするには、このような ICD の新しいバージョンが必要です。ICD がインストールされていなければ、システムはほとんどの場合、OpenGL V1.1 ソフトウェア レイヤーにフォールバックします。

アプリケーションの互換性、GDI、および古いバージョンの Direct3D

Windows Vista のグラフィック システムは、既存のシステムを継続してサポートしながら新しいテクノロジを有効にするために、幅広いハードウェアおよび使用シナリオをサポートするように設計されています。GDI、GDI+ などの既存のグラフィック インターフェイスと古いバージョンの Direct3D は引き続き Windows Vista で機能しますが、可能な場合は内部で再マップされます。つまり、既存の Windows アプリケーションのほとんどは継続して機能します。

Windows Vista は引き続き、Windows XP と同じ Direct3D および DirectDraw インターフェイスを DirectX Version 3 までさかのぼってサポートします (ただし、削除された Direct3D の Retained Mode は除きます)。Windows XP Professional x64 Edition と同様に、Windows Vista の 64 ビット ネイティブ アプリケーションは Direct3D9、DirectDraw7、またはそれより新しいインターフェイスに制限されます。高性能アプリケーションでは、ハードウェア機能に最も適合するように、Direct3D 9 以降を使用する必要があります。

推奨事項

グラフィカル アプリケーションの API を選択するときには、次の推奨事項を考慮してください。

  • アプリケーションが Windows XP またはそれより前のバージョンの Windows をサポートする必要がある場合は、Direct3D 9 を使用します。
  • XPDM ドライバーで実行されている Windows Vista および Direct3D 10 対応のハードウェアがないアップグレード システムをサポートする場合は、Direct3D 9 を使用します。
  • Windows Vista の次世代のビデオ ハードウェアを利用する場合は、Direct3D 10 を使用します。