DirectXとは
ゲームのプログラムを調べていると大体はDirectXという言葉にたどり着くかと思います。
このDirectXとはMicrosoftが提供しているゲーム・マルチメディアで処理する機能が入った*API(ライブラリ)です。
DirectXを使用することでゲームに必要な様々な機能が実現できるのでWindows環境では高確率で使用されています。
もちろんMicrosoft製であるXBox系統のゲームは全てDirectXで作成されます。
DirectXで出来ることは様々ですが、バージョン毎にも変化しています。
その中で最も使われるものが描画(画面に絵を表示する)機能です。
Direct3Dと呼ばれるものですが、DirectXと言うだけでDirect3Dを指すことも多いです。
APIとは
APIとはアプリケーションプログラミングインターフェイスの頭文字です。
こう呼ぶと難しく感じますが、簡単に言えば様々な機能を簡単に使用できるようにまとめたものです。
DirectX9
DirectX9は現役のDirectXの中で習得難度が一番低いので初心者の学習に向いているバージョンです。
WindowsXP以降のPCでは基本的に動作します。
現在ではDirectX9と言われるものは大体がDirectX 9.0cを指します。
使用するにはMicrosoftのサイトよりインストーラーをダウンロードしてくる必要があります。
※インストールする手順などは初めてのDirectX9の記事をご確認ください。
DirectX9で使用される主要な機能には下記があります。
Direct3D | 3次元グラフィックスを処理する機能です。 DirectXの本体とも言える機能です。 3Dと言っていますが2Dも扱えます。 |
---|---|
D3DX | Direct3Dで必要になる算術回りやテクスチャ―データの読み込み、モデルデータの読み込み、フォント描画などの機能が含まれています。 特に算術回りとテクスチャーの読み込み周りは初心者には必須の機能です。 |
DirectInput | キーボードやマウス、ゲームパッドといった入力周りの機能です。 DirectX8の頃から大した変更が無く、現在ではXInputの使用が推薦されています。 |
XInput | XBox 360のコントローラーを制御するための機能です。 最近ではサードパーティー性のコントローラーも多くがXInputに対応しています。 今後はこちらで実装することが推薦されています。 |
DirectX Audio | DirectSoundとDirectMusicの2つの機能から構成されたサウンド周りの機能です。
DirectSoundではWAVE(波形)情報を扱う機能です。 DirectMusicではMIDIファイルなどを扱える機能です。 |
XAudio2 | DirectSoundの後継となるサウンド周りを扱う機能です。 サウンドの再生処理や終了検知などを簡単に行えるようになりました。他にも高レベルなサウンド制御機能が備わっています。 |
DirectShow | 動画などのメディアファイルやストリーム処理を行う機能です。 2005年にDirectXから除外され、Platform SDKというものに移管されました。又、Vista以降ではMedia Foundationという後継が用意されています。 |
廃止されているけど、一応使用できる機能や重複する機能もありますが、概ねこの辺りがDirectX9で使用される機能です。
これらの中でも特に使用される機能は下記です。
- Direct3D
- D3DX
- DirectInput or XInput
- DirectSound or XAudio2
これだけあれば描画、入力、サウンドが扱えるのでゲームを作ることができます。
それ以外の機能についてはDirectX以外の機能を使って実装することもできるので使用されない場合が多いです。
DirectX11
DirectX11はDirectX9と比べて描画に関する細かな機能が増えているため難易度が格段に上がっています。
なのでDirectX9の学習後に始める人が多いバージョンです。
主にWindows 7以降のPCで動作します。
DirectX11はWindows SDKに同行されているので特にインストールなどは必要ありません。
DirectX11で使用される主要な機能には下記があります。
Direct3D | 3次元グラフィックスを処理する機能です。 他の機能がかなり絞られてきたので正に本体と言えます。 DirectX9と同様に2Dも扱えます。 |
---|---|
DirectXMath | Direct3D用の算術回りの機能をまとめた機能です。 SIMD対応が行われているのでCPUによっては高速に計算が行えます。 |
DXGI | DirectX Graphics Infrastructureと呼ばれる機能です。 主に機能の進化が緩やかなDirect3Dに依存しない部分をまとめた機能となります。 グラフィックカードやモニターの制御などを行います。 |
XInput | 以前から特に変更はありません。 ゲームパッドの入力周りにはこれが使用されます。 |
XAudio2 | XACT(イグザクト)と呼ばれる機能が廃止されたので一部の機能は無くなっていますが、概ね基本的なサウンド制御に関する機能が揃っています。 |
以前のDirectXの機能と共存もできますが、主にこれらの機能がDirectX11で使用されます。
算術回りがDirectXMathに変更されたことやD3DXに含まれていたリソース読み込み周りの処理などが無くなりました。
様々な機能がWindowsに標準搭載されているので、DirectXの役割が描画に集約されました。
XInputやXAudio2もDirectXというよりはそれぞれが個別の機能という形です。
DirectX9とDirectX11の違い
ここから今回の主題であるそれぞれのバージョンによる違いを説明していきます。
DirectX9以降はDirect3D以外の機能は基本的に更新されていないので、Direct3D周りの変化について記載します。
描画パイプライン
DirectX9には固定パイプラインが存在しています。
固定パイプラインとはワールド、ビュー、プロジェクションといった行列やライト、マテリアルの情報を設定することで描画を行ってくれる処理の事です。
固定という名の通り指定したパラメータに応じて決まった結果を返します。
DirectX11ではこの機能は廃止されています。
その為、描画に関する処理は自前で一通り実装する必要があります。
※DirectX9でもシェーダを使用して実装は出来ます。
又、DirectX11ではDirectX9よりもシェーダの種類が多くなっています。
DirectX9 | 頂点シェーダ ピクセルシェーダ |
---|---|
DirectX11 | 頂点シェーダ ハルシェーダ ドメインシェーダ ジオメトリシェーダ ピクセルシェーダ コンピュートシェーダ |
合わせてシェーダモデルのバージョンも上がっています。
DirectX9 | シェーダモデル 3.0 |
---|---|
DirectX11 | シェーダモデル 5.0 |
これによりシェーダ上で使用できる命令数や機能が大幅に増えました。
D3DX(ヘルパー機能)の廃止
D3DXが廃止されたことにより、算術回りやFont描画、テクスチャ―・モデルの読み込み処理などの機能が無くなりました。
これがDirectX11の難易度を上げる原因の一つです。
ただそれらの実装について完全に見捨てられた訳ではありません。
D3DX相当の機能が補助ライブラリとしてGitHub上で公開されています。
これらでフォント描画やテクスチャーの読み込み、モデル読み込みなどが行えます。
描画処理の分離
DirectX9ではIDirect3DDeviceがリソースの管理から描画までの全てを請け負っていました。
DirectX11ではこの部分が分離されてID3D11DeviceContextが描画処理を請け負うようになっています。
これにより次の項に記載する機能が対応可能となりました。
マルチスレッド対応
上でも記載しましたが、DirectX11ではID3D11DeviceContextが描画に関する機能を請け負っています。
通常はImmediateContextと呼ばれるデバイスコンテキストで描画を行います。
ここにDeferredContextと呼ばれるデバイスコンテキストも作成できるようになっています。
DeferredContextでは描画コマンドを生成するだけで実行はされません。
作成したコマンドはImmediateContextのExecluteCommandListで実行する必要があります。
これにより別のスレッドでDeferredContextを使用することでマルチスレッド化が行えるようになっています。
デバイスロスト
DirectX9ではフルスクリーンにした場合など、デバイスロストが発生していました。
その場合はデバイスやリソースの復帰処理を実装する必要がありました。
DirectX11ではデバイスロストが発生しなくなったので対応が非常に楽になります。
他にも色々と細かな違いもありますが、大きな違いとしてはこの辺りになります。
今後はDirectX11の記事も増やしていくので色々と違いを考えながら実装をしていくと面白いかもしれません。