📖

DirectX12で1からフレームワーク制作(3)

2023/05/27に公開

はじめに

こんにちは、はろ~です。
今回は、ポリゴンの描画までしていきます。
開発環境はVisualStudio2022です。
Github:https://github.com/nakanoyui/DirectX12Framework

DirectXMathの導入

ポリゴンの描画するにあたって頂点や法線等で算術ライブラリであるDirectXMathを使用していくのでライブラリを先に導入していきます。
メニュー→ツール→NuGetパッケージマネージャ→ソリューションのNuGetパッケージの管理

directxtk12_uwpをクリック→プロジェクトのチェックマークをクリック→インストール

インストールが出来ればPch.hに以下を追加してください。


SimpleMathを使うにあたって名前空間を省略したいのでUtility.hに以下を実装してください。

メッシュ

ではさっそくポリゴン描画に目指して準備をしていきます。
まずはGraphicsフォルダにMeshフォルダを作成し、cpp/hを追加してください。

Mesh.hの実装は以下の通りです。

Mesh.cppの実装は以下の通りです。

最後にSystem.hにメッシュを追加しておいてください。

シェーダー

メッシュの実装が出来たのでシェーダーを実装していきましょう。シェーダーは頂点シェーダーとピクセルシェーダーを実装すれば後のシェーダーに関してはデフォルト設定で動いてくれます。頂点シェーダーとピクセルシェーダーを実装しないと残念ながら描画出来ません。

頂点シェーダー

頂点シェーダーは頂点数分だけ実行されます。基本的には座標変換の処理を書いていきます。

ピクセルシェーダー

ピクセルシェーダーは画面のピクセル分だけ処理が実行されます。基本的にライティングの処理を書いていきます。

ってことでさっそく作成していきましょう。
FrameworkDX12にAssetフォルダを作成し、Assetフォルダ以下にShaderフォルダを作成してください。

シェーダーファイルを作成するにはコードではなくHLSL項目の中にある。頂点シェーダーファイルとピクセルシェーダーファイルの二つを作成してください。

名前は分かりやすくSimpleShaderで頂点シェーダーにはVSピクセルシェーダーにはPSの最後に付けています。

頂点シェーダーは以下の通りです。

ピクセルシェーダーは引数に追加分を入力しておいてください。

シェーダーの読み込みと作成

GraphicsPipeline

DirectX12の描画設定工程はGraphicsPipelineに紐づけていきます。
・頂点レイアウト
・各シェーダー
・カリングモード
・深度設定
・ブレンド設定
・プリミティブトポロジー設定
・ルートシグネチャ etc...
とかなり多いです。今回の実装ではこのGraphicsPipelineの処理はPipelineクラスを使って実装していきます。

RootSignature

先程のGraphicsPipelineの紐づけの一つとして出てきたルートシグネチャですがこちらもRootSignatureに紐づけていくものがあります。
・サンプラーステートの設定
・ディスクリプタレンジ
です。こちらの実装もRootSignatureの設定を行うクラスとして実装します。

PipelineクラスとRootSignatureクラスはShaderクラスにインスタンスを持たせてユーザーが好きに描画設定を変える事ができる実装にしていきます。

Graphics以下にShaderフォルダを作成Shader.cpp/hを追加してください。
それからShaderフォルダにPipelineとRootSignatureフォルダを作成。cpp/hをどちらも追加してください。

RootSignature.hの実装は以下の通りです。



RootSignature.cppの実装は以下の通りです。






Pipeline.hの実装は以下の通りです。




Pipeline.cppの実装は以下の通りです。









Shader.hの実装は以下の通りです。



Shader.cppの実装は以下の通りです。





System.hにShader.hを追加しておいてください。

ポリゴンを描画

描画設定クラスが完成したので、実際に描画していきましょう。
GraphicsDevice.hにPrepare関数を追加してください。

Prepare関数の実装は以下の通りです。

ScreenFlip関数の中で行っているレンダーターゲットのセットとクリアをメッシュの描画よりも前に持ってこないと折角描画したのにその後で画面のクリア命令が走ってしまってメッシュが見えません。ScrrenFlip関数の実装を更新してください。

最後にApplication.cppに以下の実装をしてください。

実行すれば三角形のポリゴンが描画されていると思います。

最後に

今後も続きを記事にするつもりですが、更新頻度に関しては不定期になります。(気が向いたら更新します)
著者は学生なので(保険)、多々間違える事があると思いますがその時は温かい目で見ていただき指摘してくださると助かります。

神戸電子専門学校ゲーム技術研究部

Discussion