C++言語でDirectX 11を使ったアプリケーションを開発してみよう。
DirectX 9の時との比較をしながらDirectX 11でのアプリケーションの作り方をまとめてみようと思います。
DirectX 9がDirectX 11になるまでの間にどのような変更点があったのかを確認してみます。
ヘルパーライブラリD3DX・DXUTは廃止
DirectX SDKがWindows SDKに統合されたタイミングでD3DXは廃止されました。
算術ライブラリについては、代わりとなる DirectXMath がSDKで提供されています。
その他、DirectX Tool Kit や DirectXTex というライブラリを入手して利用することになります。
※いずれもオープンソースの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
出力データをレンダーターゲットや深度/ステンシル バッファーの内容と結合し、最終的なパイプラインの結果を生成します。
- ~プログラミング~ DirectX 11を始めよう
- ~プログラミング~ DirectX 11はDirectX 9と何が違うか その1
- ~プログラミング~ DirectX 11はDirectX 9と何が違うか その2
- ~プログラミング~ DirectX 11の初期化をしよう その1
- ~プログラミング~ DirectX 11の初期化をしよう その2
- ~プログラミング~ DirectX 11で深度/ステンシルバッファを準備しよう
- ~プログラミング~ DirectX 11でシェーダーをコンパイルしよう
- ~プログラミング~ DirectX 11で三角形を表示しよう
- ~プログラミング~ DirectX 11の頂点バッファとインデックスバッファ
- ~プログラミング~ DirectX 11で立体を表示しよう その1
- ~プログラミング~ DirectX 11で立体を表示しよう その2
- ~プログラミング~ DirectX 11で平行光源ライティング
- ~プログラミング~ DirectX 11で点光源ライティング
- ~プログラミング~ DirectX 11で拡散反射 (Diffuse reflection)
- ~プログラミング~ DirectX 11で鏡面反射 (Specular reflection)
- ~プログラミング~ DirectX 11で環境反射 (Ambient reflection)
- ~プログラミング~ DirectX 11でフォン反射モデル
- ~プログラミング~ DirectXTexライブラリを導入しよう
- ~プログラミング~ DirectX 11でテクスチャマッピング
コメントをお書きください