Windows のグラフィックス API
Windows Vista には、Windows 98 用の Windows ドライバー モデル (WDM) の導入以来、ビデオ ドライバーの設計に大きな改訂を加えた、まったく新しいディスプレイ ドライバー モデルのサポートが含まれています。 この再設計されたモデルは、2D ラスター操作と GDI アプリケーションの世界から、固定機能グラフィックス ハードウェアを使用した 3D ゲームの世界、そして最終的には幅広い高性能グラフィックス アプリケーションをサポートする最新のプログラム可能なグラフィックス プロセッシング ユニット (GPU) の世界へのビデオ ハードウェアの進化を反映しています。 Windows 7 および Windows 8 は、追加のグラフィックス機能と API を提供することで、Windows Vista グラフィックス インフラストラクチャを基盤としています。 この記事では、Windows のグラフィックス機能と API について説明します。
- 背景
- Direct3D 9
- Direct3D 9Ex
- Direct3D 10
- Direct3D 10.1
- Direct3D 11
- Direct3D 11.1
- OpenGL
- アプリケーション互換性、GDI、および Direct3D の旧バージョン
- Recommendations (推奨事項)
背景
Windows の初期の頃から、グラフィックス プログラミング用の主要な API は、グラフィカル デバイス インターフェイス (GDI) でした。 この API は、多数の 2D 出力デバイスを処理するように設計されており、Windows ユーザー インターフェイス エクスペリエンスの基礎を形成しました。 DirectDraw と Direct3D は、当時の既存のハードウェアの拡張機能として、フルスクリーン ゲームと 3D レンダリングをサポートする代替 API として導入されました。 GDI とのやり取りは複雑でした。 この設計により、従来の GDI 要素と Direct3D 要素の効果的な混在が制限されています。 XPDM と呼ばれる Windows XP バージョンの WDM は、GDI と Direct3D の並列性を反映しています (図 1 を参照)。
図 1. Windows XP のグラフィックス API
長年にわたり、3D ビデオ カードの性能は劇的に向上し、ハードウェアの大部分がこの機能専用に使われるようになりました。 新しいドライバー モデルである Windows Display Driver Model (WDDM) により、GPU と Direct3D が前面に押し出され、GDI の 2D の世界と最新のプログラム可能な GPU のパワーをシームレスに融合した、まったく新しいエクスペリエンスである 3D デスクトップの作成が可能になります。 WDDM では、ビデオ ハードウェアは完全に Direct3D によって駆動され、他のすべてのグラフィックス インターフェイスは新しい Direct3D 中心のドライバー モデルを介してビデオ ハードウェアと通信します (図 2 を参照)。
図 2. Windows Vista のグラフィックス API
WDDM の詳細については、 Windows Vista ディスプレイ ドライバー モデル (WDDM) 設計ガイドを参照してください。
Direct3D 9
DirectX バージョン 9 は 2002 年に Windows 向けに初めてリリースされ、その後 2003 年と 2004 年に更新されました。 この API は、DirectX テクノロジの 10 年間の進化、Direct3D 用のより強力なシェーダー プログラミング モデルの導入、そして何千もの出荷タイトルに裏打ちされた成熟度を表しています。 Direct3D 9 は、Windows Vista の主要なグラフィック インターフェイスです。 これは、既存のさまざまなハードウェアおよび Windows リリースで実行する必要がある 3D ゲームやアプリケーションを作成する場合に使用する理想的な API です。 新しいドライバー モデルの詳細は、Direct3D 9 インターフェイスを使用するアプリケーションからは隠されていますが、舞台裏ではオペレーティング システムが新しい機能を最大限に活用して、GPU の真のマルチタスク、より効率的なリソース管理、堅牢なパフォーマンスを実現しています。
以前のバージョンの Windows との完全な互換性を確保するには、新しい Windows Vista ディスプレイ ドライバー モデルでも、古いドライバー モデルのいくつかの癖をエミュレートする必要があります。 たとえば、フルスクリーン アプリケーションがフォーカスを失うと、新しいドライバー モデルがデバイス コンテキストからリソースを削除せずに透過的にリソースを処理するにもかかわらず、ビデオ メモリ (VRAM) 内のすべてのリソースが失われたと想定し、アンマネージ リソースとして作成したリソースを再読み込みする必要があります。 管理対象リソース タイプとデフォルト リソース タイプの概念も、古いドライバー モデルに固有のものです。 もう 1 つの例としては、新しいドライバー モデルがほぼ無制限の量の仮想ビデオ メモリを提供できるにもかかわらず、使用可能な 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 のまったく新しいバージョン 10 では、Direct3D 9Ex では公開されていない多くの新しい機能が提供されます。 そのため、ゲームやその他のほとんどのアプリケーションでは、Direct3D 9 または Direct3D 10 が推奨される API となります。
Note
DirectX SDK では、Direct3D 9Ex インターフェイスのサンプル、ヘッダー、ライブラリは提供されません。 Direct3D 9Ex の詳細については、 DirectX for Windows Vistaを参照してください。
Direct3D 10
新しい Windows Vista ドライバー モデルと次世代ハードウェアの可能性を最大限に引き出すために、Direct3D API のまったく新しいバージョンが作成されました。 WDDM は既存のグラフィックス システムのパフォーマンスの制限の一部を解消しますが、Direct3D 10 は既存の Direct3D API の設計上のボトルネックを解消することでさらに進歩し、GPU のプログラミング タスクを大幅に簡素化します。
新しい API では、いくつかの固定機能の側面を除いてすべてが完全に排除され、プログラム可能な構造に置き換えられ、内部実装が大幅に合理化されます。 Direct3D の以前のバージョンにあった数百の機能ビットは完全に排除され、特定のリソース形式に対するオプションの使用シナリオがいくつかあるだけの、明確に定義された包括的な機能セットに置き換えられました。 CPU を集中的に使用するリソースの作成と検証には、新しい API で明示的なセマンティクスが使用されるようになりました。 これにより、パフォーマンス動作の予測可能性が大幅に高まり、描画ごとのオーバーヘッドが大幅に削減されます。 リソースは複数の形式に再構成できるため、さまざまな段階で効率的に使用でき、機能セットによってフォーマットの使用シナリオに課される制限が大幅に少なくなります。 新しいブロック圧縮法線マップ テクスチャ形式もあります。
新しい API では、シェーダー定数とデバイス状態は明示的なリソースであるため、ハードウェア上でのキャッシュの効率が大幅に向上し、ドライバー検証が大幅に簡素化されます。 プログラム可能なシェーダー モデルは頂点シェーダーとピクセル シェーダーの両方で統合され、明確に定義された計算モデルと演算子セットによって表現力が向上しました。 また、頂点シェーダ ステージの後のプリミティブを操作するための新しいジオメトリ シェーダ ステージが追加されました。 パイプラインの頂点およびジオメトリ シェーダ ステージでの GPU の作業結果は、再利用のためにビデオ RAM にストリーム出力できるため、CPU とのやり取りを最小限に抑えながら、極めて複雑なマルチパス GPU 操作が可能になります。
これらの機能強化により、次世代のグラフィックス テクノロジが可能になり、アプリケーションの作業を GPU にオフロードする機能が拡張されます。 オフロードにより、より複雑な GPU ベースのキャラクター スキニング、高速モーフィング技術、シャドウ ボリュームの生成と押し出し、完全に GPU ベースのパーティクル システムと物理システム、効率的な大規模描画バッチに結合されたより複雑なマテリアル、手続き型の詳細化、リアルタイムのレイ トレーシングによるディスプレイスメント マッピング、シングル パス キューブ マップ生成、その他多くの技術が可能になり、CPU リソースをより複雑なアプリケーションのために解放します。
Direct3D 10 でこのレベルの革新を実現するには、古いハードウェアを新しいインターフェイスの部分的な実装として表現することはできません。 ビデオ カードは、すべての新機能をサポートできるカードか、Direct3D 10 対応カードではないカードのいずれかです。 したがって、Direct3D 9 は多くの機能ビットが欠落し、使用上の制限がある DirectX7 時代のハードウェアを駆動できましたが、Direct3D 10 は新しい世代のビデオ カードでのみ動作します。 アプリケーションが古いビデオ ハードウェアをサポートするには、Direct3D 9 インターフェイスもサポートする必要があります。 Direct3D の将来のバージョンはバージョン 10 を基盤として構築され、Direct3D 10 機能の厳密なスーパーセットを確保しながら、API の新しいバージョンに拡張されます。
Direct3D 10 の詳細については、 Direct3D 10を参照してください。
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 の追加機能を利用できます。
Note
Windows Vista、Windows 7、および Windows 8 のグラフィックス システムは、既存のシステムを引き続きサポートしながら新しいテクノロジを有効にするための幅広いハードウェアと使用シナリオをサポートするように設計されています。
Note
Windows 7 および Windows Vista の更新プログラムでは、既存の Direct3D 10.1 API に DXGI 1.1、10level9 機能レベル、および WARP10 デバイスのサポートが追加されます。
Direct3D 11
Windows 7 は、Direct3D 10.1 API の設計に基づいて構築された Direct3D の新しいリビジョンである Direct3D 11 をサポートしています。 API の新機能には、マルチスレッド レンダリングとリソース作成、Compute Shader、10level9 機能レベルと WARP10 ソフトウェア レンダリング デバイスのサポート、ハル & ドメイン シェーダーを使用したテッセレーション、BC6H および BC7 テクスチャ圧縮形式、Shader Model 5.0、Dynamic Shader Linkage などの新しい Direct3D 11 クラスのハードウェア機能が含まれます。 新しい API では、既存の Direct3D 10 および 10.1 クラスのビデオ カード、機能サポートが制限された 10level9 機能レベルまでの一部の Direct3D 9 カード、および最新世代の Direct3D 11 クラスのビデオ カードを使用できます。
Direct3D 11 API に加えて、Windows 7 には DXGI 1.1、Direct2D、DirectWrite、および WDDM 1.1 ドライバーのサポートが含まれています。
Note
Direct3D 11 および関連 API は、Windows Vista のアップデートとしても利用できます (DirectX の最新バージョンのインストール方法を参照)。
Direct3D 11.1
Windows 8 では、 Direct3D 11 API が Direct3D 11.1 で拡張されています。 Direct3D 11.1 は、 機能レベル 11、10_x、および 9_x をサポートする既存のすべてのハードウェアと、新しい 11_1 機能レベルをサポートします。
Windows 8 には、 Direct3D 11.1 APIに加えて、 DXGI 1.2、 Direct2D デバイス コンテキスト、および WDDM 1.2 ドライバーのサポートが含まれています。
Note
Windows ストア アプリで DirectX を使用して 3D グラフィックスをプログラムする場合は、Direct3D 11.1 API を使用できます。 DirectX を使用した 3D グラフィックスのプログラミングの詳細については、「DirectX を使用した 3D グラフィックスの概要」を参照してください。
Windows 7 のプラットフォーム更新プログラム: Windows 7 のプラットフォーム更新プログラム がインストールされている Windows 7 または Windows Server 2008 R2 では、 Direct3D 11.1 API が部分的にサポートされます。 Windows 7 のプラットフォーム更新プログラムの詳細については、「Windows 7 のプラットフォーム更新プログラム」を参照してください。
OpenGL
Windows Vista、Windows 7、および Windows 8 は、OpenGL に対して Windows XP と同じサポートを提供します。これにより、ビデオ カードの製造元は、ハードウェア アクセラレーション サポートを提供する OpenGL 用のインストール可能なクライアント ドライバー (ICD) を提供できます。 Windows Vista、Windows 7、または Windows 8 を完全にサポートするには、このような ICD の新しいバージョンが必要であることに注意してください。 ICD がインストールされていない場合、ほとんどの場合、システムは OpenGL v1.1 ソフトウェア レイヤーにフォールバックします。
アプリケーション互換性、GDI、および Direct3D の旧バージョン
Windows Vista、Windows 7、および Windows 8 のグラフィックス システムは、既存のシステムを引き続きサポートしながら新しいテクノロジを有効にするための幅広いハードウェアと使用シナリオをサポートするように設計されています。 GDI、GDI+、Direct3D の古いバージョンなどの既存のグラフィックス インターフェイスは、Windows Vista および Windows 7 でも引き続き動作しますが、可能な場合は内部的に再マップされます。 つまり、既存の Windows アプリケーションの大部分は引き続き動作します。
Windows Vista、Windows 7、および Windows 8 は、Windows XP と同じ Direct3D および DirectDraw インターフェイスを引き続きサポートし、DirectX バージョン 3 に戻ります (削除された Direct3D の保持モードを除く)。 Windows XP Professional x64 Edition と同様に、新しいバージョンの Windows 上の 64 ビット ネイティブ アプリケーションは、Direct3D9、DirectDraw7、またはそれ以降のインターフェイスに制限されます。 高性能アプリケーションでは、ハードウェアの機能に最も近いものを確実に得るために、Direct3D 9 以降を使用する必要があります。
推奨事項
グラフィカル アプリケーションの API を選択するときは、次の推奨事項を考慮してください。
- アプリケーションで Windows XP またはそれ以前のバージョンの Windows をサポートする必要がある場合は、Direct3D 9 を使用します。
- XPDM ドライバーで実行されている Windows Vista または Windows 7 をサポートする場合は、Direct3D 9 を使用します。 Direct3D 10 以上のビデオ ハードウェアが搭載されていない Windows Vista または Windows 7 システムの場合は、既存の Windows XP Direct3D 9 コード パスを使用するか、Direct3D 10.1 または Direct3D 11 API を通じて 10level9 機能レベルを使用するかを選択できます。
- Direct3D 11 を使用して、Windows Vista、Windows 7、Windows 8 の次世代ビデオ ハードウェアを活用します。 Windows ストア アプリでは Direct3D 11 以降を使用する必要があります。