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の記事も増やしていくので色々と違いを考えながら実装をしていくと面白いかもしれません。