Visual Studio 2019 で error MSB6006

Visual Studio 2019 で DirectX12 Graphics Sample の Raytracing 系プロジェクトをビルドしようとすると下記のエラーが起こった。

error MSB6006: “dxc.exe” exited with code -1073741819.

"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\dxc.exe" /Zi /Od /Vn"g_pRaytracing" /Fo "C:\Github\DirectX-Graphics-Samples\Samples\Desktop\D3D12Raytracing\src\D3D12RaytracingHelloWorld\Raytracing.cso" /Fh "C:\Github\DirectX-Graphics-Samples\Samples\Desktop\D3D12Raytracing\src\D3D12RaytracingHelloWorld\CompiledShaders\Raytracing.hlsl.h" -T "lib_6_3" "C:\Github\DirectX-Graphics-Samples\Samples\Desktop\D3D12Raytracing\src\D3D12RaytracingHelloWorld\Raytracing.hlsl"

とりあえず手動でシェーダーコンパイルすれば実行だけはできたけど。(マジか)

DirectX12 Ultimate は次世代グラフィックス技術の総称

DirectX12 Ultimate とは?

DirectX12 Ultimate は 次世代のゲームグラフィックスで使われる機能の総称。また、それらを実現するための DirectX12 API の仕様である。

  • Ray Tracing
  • Mesh Shading
  • Variable Rate Shading,
  • Sampler Feedback

これらの技術に関しては、既に発表されていたものもあるため特に目新しさは感じないですが、Xbox Series X など次世代ゲーム機が発売すると噂されている2020年に、改めて今後のゲームグラフィックスで使われる技術やキーワードが何かをまとめて体系化したものに「DirctX12 Ultimate」という名前がついた感じでしょうか。

Announcing DirectX 12 Ultimate
https://devblogs.microsoft.com/directx/announcing-directx-12-ultimate/

DirectX 12 Ultimate Getting Started Guide
https://devblogs.microsoft.com/directx/directx-12-ultimate-getting-started-guide/

NVIDIA Gameworks – DirectX
https://developer.nvidia.com/directx

DirectX Raytracing 1.1

DXR には、DXR 1.0 と DXR 1.1 がある。

Shader Model 6.5

2019年10月15日にリリース。Windows 10 20H1 で使用できる。

HLSL Shader Model 6.5
https://microsoft.github.io/DirectX-Specs/d3d/HLSL_ShaderModel6_5.html

最新の DirectX を利用するために OS のアップデート

DXR の実行もそうだが OS (Windows 10 のバージョン) をアップデートしないと、最新の DirectX の機能を利用できないのはナゼなんだろう。単純に sdk や driver や dll のバージョンを上げるだけでは、最新の機能は使えない。

参考リンクの記事に、DirectX は Windows のコンポーネントとして提供されるようになったため、dll 単体での更新が出来ないというのが理由だろうか。じゃあ、新しい Windows 10 から D3D12.dll だけをバージョンが古い Windows 10 にコピーした場合の挙動はどうなるんだろう。

driver とか dll とか、プログラムが実行できる仕組みとか、その辺りをちゃんと勉強する必要がありそう。

D3D12.dll は下記の両方に存在している。
C:\Windows\SysWOW64
C:\Windows\System32

参考リンク
https://support.microsoft.com/ja-jp/help/17r9113/how-to-install-the-latest-version-of-directx
https://powerpro.at.webry.info/201511/article_43.html
https://wa3.i-3-i.info/word14254.html
https://wa3.i-3-i.info/word14253.html

DirectX12 のサンプルはなぜ WM_PAINT で更新と描画をしているのか?

DirectX12 のサンプルを読んでいて不思議に思うのは、Update 関数と Render 関数が、メッセージループでは無くてウインドウプロシージャで処理されていることです。

DirectX9, 10, 11 のサンプルだと、更新と描画関数はメッセージループで処理されていたため、そのやり方が DirectX のお作法だと思っていたのですが、DirectX12 のサンプルからは突如として WndProc の WM_PAINT で処理されるように変更されました。

特に調べてもこれと言った理由にはたどり着けなかったのですが、推測も含めて自分なりの答えをメモとして残します。

なぜ、 WM_PAINT で更新と描画を行なっているのか?

恐らく UWP とコードの共通化を行いたかったためと思われます。DirectX12 のサンプルから、UWP と Desktop (WindowsAPI) のそれぞれに対応したサンプルが提供されています。

UWP の場合は Windows API のような、低レベルのメッセージループ処理を書く必要はありませんが、イベントに対応する関数をシステムに登録して、必要に応じてイベントドリブンで処理されます。この部分が、Windows API のウインドウプロシージャと同じなため、アプリケーション側はイベントハンドラー内で呼び出される関数のみを用意すれば良く、それが OnUpdate と OnRender として定義されており、Windows API からはウインドプロシージャで処理するようになったと推測します。

だがしかし、UWP 側は View::Run() の中で、ループを回して処理しているので、Windows API 側も似たようにメッセージループ内に書けば良かった気もし無いでも無いです。

なぜ、WM_PAINT が毎フレーム発行され続けるのか?

この挙動が不思議でした。Windows API の DirectX のサンプルの挙動を見ていると、WM_PAINT メッセージが毎フレーム呼び出されています。

通常、WM_PAINT は UpdateWindow() や InvalidateRect() が呼び出されて、再描画が必要な時に発行されるはずです。これらの関数呼び出しを行なっている箇所も見当たらないため、なぜ、毎フレームWM_PAINT に来るのか疑問でした。

少しテストしてみたら、WM_PAINT が発行された後に BeginPaint() などで描画処理を行わないと、WM_PAINT が発行され続ける挙動があるみたいです。DirectX ではウィンドウの更新は全て DirectX API が行うため、Windows API の描画命令が呼び出されることはありません。そのため、Windows は、再描画の依頼を出し続ける事により、連続的に WM_PAINT が呼び出される事で、毎フレームの更新が実現されています。

Visual Studio 2019 で FBX SDK

ViewScene サンプルプロジェクトをテスト実行。

プロジェクト構成は x64 に変更し、VS2019 で実行したときに、FBX SDK 以下にフォルダが作られるため、アクセス権を設定しておく。

DirectX Raytracing のドキュメント

DirectX Raytracing (DXR) Functional Spec
https://microsoft.github.io/DirectX-Specs/d3d/Raytracing.html

DXR のドキュメント (リファレンス) は、少し前まで word ファイルで提供されていましたが、今は github io から閲覧できるようになったのですね。

公式のドキュメントを補足する形の情報が、こちらの github 上にまとめられているみたいです。
https://microsoft.github.io/DirectX-Specs/