~プログラミング~ DirectX 11はDirectX 9と何が違うか その1

C++言語でDirectX 11を使ったアプリケーションを開発してみよう。

DirectX 9の時との比較をしながらDirectX 11でのアプリケーションの作り方をまとめてみようと思います。

 

DirectX 9がDirectX 11になるまでの間にどのような変更点があったのかを確認してみます。


ヘルパーライブラリD3DX・DXUTは廃止

DirectX SDKがWindows SDKに統合されたタイミングでD3DXは廃止されました。

 

算術ライブラリについては、代わりとなる DirectXMath がSDKで提供されています。

その他、DirectX Tool KitDirectXTex というライブラリを入手して利用することになります。

 

※いずれもオープンソースのC++専用補助ライブラリがMITライセンスでGitHubにて公開されている


固定機能パイプラインは廃止

DirectX 9までは、ワールド・ビュー・射影などの座標変換だったりライティングやマテリアルの設定をする為の関数がありましたが、これらは廃止されました。

 

以下は固定機能パイプラインの廃止によって無くなった関数です。

  • IDirect3DDevice9:DrawRectPatch
  • IDirect3DDevice9:DrawTriPatch
  • IDirect3DDevice9:LightEnable
  • IDirect3DDevice9:MultiplyTransform
  • IDirect3DDevice9:SetLight
  • IDirect3DDevice9:SetMaterial
  • IDirect3DDevice9:SetNPatchMode
  • IDirect3DDevice9:SetTransform
  • IDirect3DDevice9:SetFVF
  • IDirect3DDevice9:SetTextureStageState

これらで行っていた事はすべてプログラマブルシェーダーで行うことになります。

プログラマブルシェーダーはHLSLというシェーディング言語を使う為、HLSLの習得が必須となります。

 

※DirectX 9まで利用できたアセンブリ言語で記述されたシェーダーは使えなくなっているという意味でもHLSL必須


グラフィクスパイプラインの比較

Vertex ShaderはTessellatorより前になりました。

(DirectX 10ではTessellatorが無くなり(Geometry Shaderで代用?)DirectX 11でまた追加された)

Hull Shaderが追加されました。

Domain Shaderが追加されました。

Geometry Shaderが追加されました。(DirectX 10から追加)

RasterizerはDirectX 9のGeometry Processingにあたる工程?

Input Assember

バッファーからプリミティブ データ (ポイント、線、三角形) を読み出し、このデータをアセンブルして、他のパイプライン ステージで使用できるプリミティブにします。

 

Vertex Shader

トランスフォーム、スキニング、モーフ、頂点単位のライティングなど、頂点単位の処理が実行されます。頂点シェーダーは、常に1つの入力頂点を処理し1つの出力頂点を生成します。

 

Hull Shader

Tessellator・Domain Shaderと共にテッセレーションを実装します。 

ポリゴンの分割方法やパラメータを定義します。

 

Tessellator

Hull Shader・Domain Shaderと共にテッセレーションを実装します。

ポリゴン(クワッド、トライアングル、またはライン) を分割します。

 

Domain Shader

Hull Shader・Tessellatorと共にテッセレーションを実装します。

分割されて出来た頂点に対して処理を行います。

 

Geometry Shader

プリミティブ全体 (線の2つの頂点、三角形の3つの頂点、点の1つの頂点など)の頂点に対して処理します。

 

Stream Output

パイプラインからラスタライザーへの途中にあるプリミティブ データをストリーム出力することができます。出力されたデータは、パイプラインに入力データとして読み込んで循環させたり、CPU へ読み戻すことができます。

 

Rasterizer

プリミティブのクリッピング、ピクセル シェーダー用プリミティブの準備、ピクセル シェーダーの呼び出し方法の決定を実行します。

 

Pixel Shader

ピクセル単位の出力を生成します。 

 

Output Merger

出力データをレンダーターゲットや深度/ステンシル バッファーの内容と結合し、最終的なパイプラインの結果を生成します。