前回の記事で初期化ができたということで、
今回は初期化した上から三角形を表示させてみようと思います。
プロジェクトの作成
前回のソリューション “DirectX12_Sample.sln” を立ち上げて、
右の「ソリューション エクスプローラー」から、
「ソリューション ‘DirectX12_Sample’ (1/1 プロジェクト)」を右クリックで、
「追加」→「新しいプロジェクト」を選択しプロジェクト作成していきます。
プロジェクトテンプレートは前回同様、「Windows デスクトップ ウィザード」を選んでください。
プロジェクト名は、” 0002_Triangle “としておきます。
あとは、前回(1. 初期化)と全く同じです。
プロジェクトの設定
ソースを作成する前に、プロジェクト設定をします。
前回同様、プロパティダイアログから、
「構成プロパティ」→「VC++ディレクトリ」の中にある「インクルードディレクトリ」と「ライブラリディレクトリ」の項目の中を確認します。
インクルードディレクトリ:
$(VC_IncludePath);$(WindowsSDK_IncludePath);
ライブラリディレクトリ:
$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86)
上記のようになっていたらOKです。
次に、「構成プロパティ」→「リンカー」→「入力」の中にある「追加の依存ファイル」の項目で以下のように変更しましょう。注意※これは前回とは違います。
d3d12.lib;dxgi.lib;d3dcompiler.lib;%(AdditionalDependencies)
d3dcompiler.libが追加されています。
d3d12.libとdxgi.libのライブラリを予め準備し、さらにシェーダコンパイラであるd3dcompiler.libを準備する設定となります。
ソリューション ” DirectX12_Sample ” でこれ以降のプロジェクト作成でも、
このようにいちいち設定しなければいけません。
ちなみに、この「追加の依存ファイル」を設定しない場合は、main.cppソースの中で#includeの後に以下を挿入する必要があります。
#pragma comment(lib, "d3d12.lib")
#pragma comment(lib, "dxgi.lib")
#pragma comment(lib, "d3dcompiler.lib")
今回も前回同様、ソース内に#pragmaを記述しています。
ソースコード
以下がソースです。これも前回同様、流れが分かりやすいようにmain.cppだけでまとめました。
Microsoft公式のサンプルソース(Github)を基にMSDNを参考にしながら噛み砕いて省いて整えましたので、初心者にとっては一番わかりやすいかと思います。
以下のソースをコピペするか、ダウンロードしてVisual Studio の「ソースファイル」に保存してください。
コピペするなら、
「ソースファイル」で右クリックして
「追加」→「新しい項目」で、「C++ ファイル」を選び、名前を” main.cpp “にして追加ボタンを押して作成してください。
ダウンロードなら、
同じく「ソースファイル」で右クリックして
「追加」→「既存の項目」で、main.cppを選択して追加してください。
そして、d3dx12.hも前回同様インクルードしますので、
以下のヘッダファイルをダウンロードしてプロジェクトの「ヘッダー ファイル」に「既存の項目」から追加してください。
次に、シェーダを読み込む必要があります。
これがないと描画できません。
これは「ソース ファイル」から「追加」→「新しい項目」で、
「Visual C++」→「HLSL」の中で.hlslなら何でもいいのですが(Visual Studio側が勝手にテンプレートを作るだけなので)、
ここでは「ジオメトリ シェーダー ファイル (.hlsl)」を選んで、
名前を” shaders.hlsl “にして追加ボタンを押してください。
すると、「ソース ファイル」中にshaders.hlslが作れますので、
中にあるコードを全て以下のコードでコピペして上書きするか、
ダウンロードして「既存の項目」で追加しましょう。
shaders.hlsl
ただ、これだけではビルドしても動きません。
あと、shaders.hlsl自体にもプロパティ設定をする必要があります。
カーソルを「ソリューション エクスプローラー」内にある「shaders.hlsl」にかざして右クリックし、
「プロパティ」を選んで、プロパティダイアログを開きます。
「構成プロパティ」→「全般」の中の「項目の種類」という項目で「HLSLコンパイラ」から「カスタム ビルド ツール」に変更します。
そのまま適用ボタンを押し、切り替えて、
「カスタム ビルド ツール」の中の「コマンド ライン」と「出力ファイル」の項目にそれぞれ、
copy %(Identity) "$(OutDir)" > NUL
$(OutDir)\%(Identity)
を入力します。
これでexeと同じディレクトリ下にshaders.hlslがコピーされます。
これでOKを押して、以上で作成は完了です!!
以下のようになっていればOK。
ツールバーの「デバッグ」から「デバッグの開始(F5)」で実行できます。
ビルドするときは、「0002_Triangle」を右クリックして「スタートアップ プロジェクトに設定」を押してプロジェクトターゲットを変更してからするようにしてください。
画面にレインボー三角形が表示できたら終わりです。お疲れさまでした。
最後に
難易度の高いプログラミングをする上では、プログラムを最初から少しずつ自分の手で作るというよりも、
ネットから拾ってきたサンプルを読み込んでビルドが通るようになれば、あとはデバッグしてステップ実行して何をしているかをイメージしながらざっと読み解いた方が効率よく学習できます。
それに、学習を進めていく中でバージョンアップによる差分をすぐに確認できるように「WinMerge」というソフトを導入した方がすぐにでもプログラムを理解できるようになるかと思います。
この作例では、前回の記事「DirectX12 | 1. 初期化」でのmain.cppと今回のmain.cppとで差分を確認して学習に活かしてください。
何のコードが追加されたのかがすぐに分かります。
一つ一つのプログラム名の意味にフォーカスしていては日が暮れてしまいますので、プログラムの流れからコードを作成する慣れを身に付ければ、すぐに実践に移すことができるようになるはずです。
その実践を積み重ねていく中で、自然に一つ一つの意味が段々分かるようになるかと思います。
これは、インプットはアウトプットと同時に行わなければ機能しないということをも意味していますので、サンプルを見てもらって役に立ってもらえればいいかなと思っています。
これで容易く挫折するなんてことはしなくなります。
まあ、頭よりも体(感性)で覚えるタイプの私ですからこのように言うんですけど(笑)
プログラマーはどっちかっていうと、記憶力よりも思考力だと思います。
プログラマーの皆さんのほとんどはそうだと思いますがどうでしょうか。
まとめ
しかし、DirectXで三角形を描画するだけでも一苦労です。
ゲーム作りたいならやっぱりUnityの方がいいというのも納得ですね(笑)
よく考えれば、そんなに需要なんてありませんね。。
しかし、DirectXを使いこなせる人は、他のプログラミング言語でも難なく使えるでしょう。
そういうメリットもあるのが、DirectXに対する学習だと思います。