Playing with Real-Time Shadowsについてのメモ

新年明けましておめでとうございます。
本年もProject ASURAをよろしくお願い致します。

昨年から、ちょっと分け合って各社さんとお話しする機会があって,その中でシャドウについて困っているという話題になりまして。
改めて、シャドウ関連を調べなおしているのですが,13年前にわからなかったことが,GPTさんのおかげでようやく分かるようになってきたので、
今日は今後の実装用にメモを残しておこうと思います。
資料は、下記になります。Real-Time Shadowsのページからダウンロードできます。
[Kasyan 2013] Nikolas Kasyan, “Playing with Real-Time Shadows”, SIGGRAPH 2013.

まずは、コンタクトシャドウについてから。

ベント法線を用いて適用します。ベント法線というの遮蔽されていない方向の平均を表します。


コアとなるアイデアはSSDOと同じです。
・スクリーン空間でオクルージョンを計算し,ライティングに乗算します。
・ソフトなコンタクトシャドウを生み出せる
・シャドウバイアスの問題も隠すことが可能。
・SAOのみに比べて大幅な品質向上


オクルージョン情報の生成ですが
・SSAOパス内で,ベント法線N’を計算し保存する
 ・ベント法線は遮蔽されない方向の平均
・任意のセルフオクルージョンを持たないクリーンなSSAOと,比較的に広範囲な半径を必要とする。
なので,SSAOをちろっと変更すればいいです。最近ですと,IntelのGTAOのサンプルだとベント法線計算してくれたりするサンプルがあるので,そういうのを参考にすればいいでしょう。

各ライトに対してですが
・dot(N, L)を通常のように計算
・dot(N’, L)を計算
・中心深度はフル解像度で,その他のタップはすべて,FP16の半解像度深度で計算
・2つの内積間の差分をクランプしたオクルージョン値で乗算することでライティングを減衰させる
…という計算をするそうです。
ベント法線を用いることで,バイナリパッキリ状態を防ぐというのがミソっぽいですね。
疑似コードで書くと次のような感じでしょうか?

 auto dp0 = dot(N, L);
 auto dp1 = dot(N_bent, L);
 auto occlusion = saturate(dp0 - dp1);
 auto result = LightingResult * occlusion;


単純なトリック/近似
・スクリーン空間のライトベクトルに沿ったレイキャスティング
・カットシーンでは、影響を受ける深度バッファ範囲を指定します。
・レイの長さのトラッキングにより、適切なソフトシャドウの計算も可能

と書いてありますが,衝突点までの長さを求めておくことで,ソフトシャドウ計算に利用するようです。例えば棒が1本突っ立っているシーンを想像すると,地面に近い個所はハードシャドウ気味になりますが,棒の先端に対応する地面から離れている部分のシャドウはソフトシャドウ気味になるはずです。これをレイの長さを使って実現するというようです。詳しい計算方法が載っていないので、おそらくアドホックな実装なのではないかと思われます。


続いてカスケードシャドウマップの話題です。


カスケードシャドウマップの分割の際に考慮するべきこと
・カスケードされた分割錐台のオーバラッピング
 ・ニア平面に近い分割では、正確な対数分布を使用することは困難。
 ・最も近い分割を手動で調整
・効率的なカスケード分割は、カメラの近接平面と視野に非常に敏感。
 ・より大きなFOVはシャドウ錐台のオーバーラッピングを増加させる
 ・FOVを大きくすると、シーンの非表示部分でシャドウマップの無駄が増えます。
・ニア平面に近いほどシャドウの視錐台のオーバーラップが増加
・深度範囲が制限されたカットシーンのCSM境界を狭くする


ライト空間 vs. ビュー空間錐台のアライメント
・ビュー空間整列
 ・より良いシャドウ空間の利用
 ・錐台のオーバーラッピングが少ない
 ・高いシャドウマップサンプリング密度
 ・シャドウマップがアンダーサンプリングされる場合においてシャドウが安定しない(シャドウエイアシング – カメラ移動に対する shimmering )※shimmeringというは揺らぎやチラつき。


ライト空間整列されたシャドウの視錐台
・視錐台のオーバーラップの増加によるシャドウマップの使用効率の低下
・シャドウ・カスケード・キャッシュの効率化
・シャドウマップテクセルサイズのスナップを使用できる
・移動カメラによるアンダーサンプルシャドウマップに対してシャドウが安定する

wp-image-13868″ />
影響する要因:
・低いシャドウマップサンプリング密度
・深度バッファの精度
・カメラに相対する光源の向き


エエイリアシングを克服するためのさまざまなシナリオ
・サンシャドウ:スロープスケール深度バイアスでフロントフェイスで描画
・ポイントシャドウ:バックフェースでレンダリング,インドアについてうまく動作する
・離れたLODの分散シャドウ-両方の面をシャドウマップにレンダリング
深度バッファ精度の問題を克服するために遅延シャドウパス中の定数深度バイアスを使用する


・最近のゲームでは、ほとんどアンダーサンプルのシャドウが使用されています。
・カスケード分割は効率的ではない
・シャドウマップテクセルスナップ、オブジェクト単位のシャドウなどのトリック
・レベル/カットシーンごとに微調整されたソリューション

(今見ると,13年経ちますが問題はあまり解決されていないですね…。)


主な目標–達成しようとしていること
・カスケードシャドウマップの視錐台のオーバーラップの除去/最小化
・シャドウマップの未使用領域を除去/最小化する
・シーンの非表示部分でのシャドウマップの無駄を最小限に抑える
・シャドウマップのサンプリング密度を非常に高くする ー シャドウマップのテクセルスナップなどのテクニックが不要にする
・シーンのすべての領域で、ほぼ一定のシャドウマップサンプリング密度を保証する
 ・シャドウマップの密度を一定に近づけると、シャドウエイリアシングの問題に対処できる


カスケードシャドウマップに対する斜投影
・平行投影法の一種
・平行光線を交差させてイメージを投影します。(「プロジェクタ」) を、ターゲット投影平面を持つ3次元ソースオブジェクトから作成します。
・プロジェクターが投影平面に対して垂直ではない


プロジェクタは、2つの角度αおよびλによって定義される。
αは直線 (x, y, xp, yp) と投影平面との間の角度
λは、直線(x、y、xp、yp)と投影平面上のX軸との間の角度
L=線分の長さ (x, y, xp, yp) で,L1=L/z


・斜投影を使用する
・視錘台クリップ平面をシャドウマップ投影平面として使用する
・投影平面は5つの錐台平面から選択される(ファー平面は無関係)
・シャドウ投影の斜投影平面は、ライトの方向に基づいて選択される。
 ・平面法線とライト方向の間の内積の符号が最も近い平面と同じである平面を選択します。


・投影平面はセグメントに分割され、対数分布の近似値が得られます。
 ・平面セグメントは基本的にシャドウマップのカスケードです。
・遠くのセグメントは、同じシャドウマップ解像度でより多くの領域をカバーします。
・シャドーキャスタのCPUカリングは、斜錐台のセットで実行されます。


シャドウマップパラメータ化
・ 錐台セグメントを四角形に延長し、矩形シャドウマップを使用する
 ・対数分割の近似値を得るには、より多くの平面セグメントが必要です。
 ・無駄なシャドウ空間
・ビューカメラの透視ワープを斜投影と一緒に使用する
 ・ニア平面をシフトおよび拡大した仮想ビューカメラ
 ・無駄なシャドウスペースがほとんどない
 ・shimmeringを克服するのに十分なシャドウマップサンプリング密度がある場合に使用できる
・投影平面セグメントに対する対数分布


斜シャドウ投影
・シャドウマップは視錐台を正確にカバーします。
・シーンの非表示領域では、シャドウマップのごく一部のみが無駄になります。
・カスケードの重複なし
・キャスターが最も適切な平面セグメントに投影されるため、シャドウを受ける可能性のある領域では、シャドウサンプリング密度が保証されます。
・このアプローチは、ライトの方向に関係なく、ほぼ一定のシャドウマップサンプリング密度を維持するように設計されています。
 ・シャドウエイリアシングの問題の解決に役立ちます。


実装詳細
・シャドウマップ描画
 ・視錐台平面の各分割は個別に処理されます。
 ・ジオメトリシェーダは、必要に応じて平面上の複数のセグメント間で三角形を複製します。
 ・ビュー空間のZ座標に基づいて適切な平面のセグメントが選択されます。


・ディファードシャドウレンダリング
 ・結果として、すべての斜投影シャドウマップからシャドウを適用します。
 ・斜錐台が重ならないため、カスケード間の複雑なステンシルは必要ありません。
 ・グローバルシャドウマップセグメント/カスケードをインデックス化するテクスチャ配列
・フォワードシャドウレンダリング
 ・シャドウマップ領域へのシャドウ領域の1対1対応による単純なシャドウマップインデックス
・クラスターフォワードとクラスターディファードシェーディング
 ・シャドウの視錐台のオーバーラップなし
 ・クラスターを斜め投影のシャドウマップ領域に1対1で対応させた単純なシャドウマップ索引付け


斜シャドウ投影機能
・テクスチャ空間の効率的な使用
・シャドウエイリアシングの問題の改善
・保証されたシャドウマップサンプリング密度に近づけることができます。
・高解像度シャドウマップを使用する場合はエイリアシングがない(1~2K、最適な4K)


…というわけで、斜投影を使ったシャドウマップがかなりよさげな感じします。これとSDSM組み合わせれば最強じゃね?感が個人的にはあるんですが,どうなんでしょ。
昔からググり続けているんですが,まともな実装をみたことがないので,今年どこかで実装出来ればなぁーと思っています。
あるいは実装したよ!とか,ここに実装あるで、みたいな情報お持ちの方がいれば是非教えてください。よろしくお願い致します。

リングコマンド!

こんばんわ、Pocolです。

ImGui使っていると、なんかみんな同じ見た目になってしまって面白くないなーと思いました。
そこで,聖剣伝説風のリングメニューを作ってみました。

ソースコードはGitHubにあげています。
https://github.com/ProjectAsura/ImGuiRingMenu

使い方はいたって簡単です。
メニュー項目は第1引数にラベル名,第2引数にImTextureID型のアイコン画像を指定してください。
実装例は次のように追加します。

ImGuiRingMenu menu;
menu.Add({"Menu1", MenuIcon1});
menu.Add({"Menu2", MenuIcon2});
menu.Add({"Menu3", ImTexureID_Invalid});

アイコン画像がない場合は,ラベル名の1文字目をアイコン代わりに描画します。
アニメーション更新のため,毎フレームImGuiRingMenu::Update()と,ImGuiRingMenu::Draw()を呼び出してください.

// アニメーションを更新.
menu.Update(deltaSeconds);

// 描画処理.
if (menu.Draw(selectedItemIndex))
{
    // ここで,選択された項目に応じた処理を行う.
    ...
}

アイコンを削除したい場合は,Remove()を利用します。第1引数にメニュー項目番号を指定してください。
終了処理などで一気にメニュー項目を削除したい場合は,Clear()を呼んでください。
キーを操作を変更したい場合は,ImGuiRingMenu::ConfigのKeyMenuStartやKeyXXXという値を使用したキーのImGuiKey列挙体の値に変更してください。

…というわけで、自作したリングメニューの紹介でした。

あとで読むリスト

こんばんわ、Pocolです。
仕事が忙しすぎて、全然最近論文が読めていないです。
年末・年始の時間を使って、今年の論文を見ておきたいなーと思ったので,メモを随時追加しておくことにします。

SIGGRAPH 2025

・Spherical Lighting with Spherical Harmonics Hessian
  岩崎先生と土橋先生のやつ。
・Bernstein Bounds for Caustics
  コースティクスが気になったので…。
・WishGI: Lightweight Static Global Illumination Baking vis Spherical Harmonics Fitting
  メモリ削減がかなりできるらしい。
・Segment Based Light Transport Simulation
  蜂須賀先生が共同著者にいるやつ。頂点ベースではなくセグメントベースで光輸送を計算する新しいレンダリング手法っぽい。
・Histogram Stratification for Spatio-Temporal Reservoir Sampling
  画像をみる感じだと良さげ。

Eurographics 2025

・Fast Sphere Tracing of Procedural Volumetric Noise for Very Large and Detailed Scenes
  スフィアトレーシングの高速化の話っぽいので,雲とかのレンダリングの高速化に使えるかも。
・Physically Based Real-Time Rendering of Eclipses
  日食の物理ベースレンダリングで、画像がかっこいい。大気の話も含んでいるかもしれないので、あとで確認。
・Dynamic Voxel-Based Global Illumination
  あまり良くはなさそうだが、アイデアがもらえるかもしれないので見る。

I3D 2025

・Aokana:A GPU-Driven Voxel Rendering Framework for Open World games
  メモリ使用量が従来の1/9で,レンダリング速度が最大4.8倍速くなるらしいので、要チェック。

レイトレ合宿11 参加レポート

こんにちわ、Pocolです!
毎年恒例のレイトレ合宿に参加してきました。
ついに第1回合宿から連続で作品提出しているのは,ykozwさんと私だけになってしまったので,どんなにへぼくても何とか来年も作品提出できるように頑張ろうと思いました。

本戦

今年は最多の22作品+1エクスビジョンという結果になりました。

さて、今年の私の提出作品ですが,下記のような作品を作りました。


ソースコードは下記にて公開しています。
https://github.com/ProjectAsura/ponzu/tree/rtcamp_2025

実装概要ですが,下記のような感じです。

今年はブリキのおもちゃ感をテーマにレンダリングしてみました。
まぁ、実装の方は大したことやっていないのですが,RISを導入してみました。
気持ち収束が早くなったかな?という感じがしていますが、ちゃんと比較していないので気のせいかもしれません。

昨年までは乱数生成にPCGを使っていたのですが,今年はAndanteさんのブログで紹介されているIbuki Hashに変更してみました。サクッと差し替えできるのでお勧めです。

あと、去年まではお手製デノイザーを使っていたのですが、このデノイザー内でクロスバイラテラルフィルタを使用していたのですが,この関係で最終出力結果がボケボケな絵になってしまうということが分かったので,今年は思い切ってクロスバイラテラルフィルタを一切使わないという割り切った実装にしてみました。そのおかげでスペキュラーがいい感じの見た目になるようになりました。

アセット作成にはAsset Forgeを使用しました。


Kenneyさんのサイトで配布しているキットバッシュとAsset Forgeを使って,レベルを作りました。
Asset Forgeを初めて使う状態でしたが,操作が簡単なので2時間ぐらいでレベルを作成しました。何とか間に合ってよかったです。お手軽にシーンが作成できるようになったので、来年も使おうかなとおもっています。おススメです。
 ちなみにAsset Forgeは下記から購入できます。日本円で約3000円ちょっとでそんなにお高くないので,自分で配置シーンツールとか作るのがかったるい人には良いと思います。
https://kenney.nl/tools/asset-forge

セミナー


今年も、非常に盛りだくさんの内容でした。
また、皆さんのセミナー資料がアップされたら、順次取り上げていこうと思います。

今年度は本当に時間がなかったので、比較的に誰にも分かる内容かつ知らない人には役立つ内容ということで,DXR 1.2の機能紹介をちらっとやりました。
以下に資料を上げているので,興味ある人は見てやってください!

…ということで本業で忙しい状態でしたが、今年も何とか参加できて良かったです。
このあと、参加者の方から続々とレポートが上がってくると思われるので,そちらも楽しみです。
みなさん、レイを飛ばしましょう!では。

恒例のBBQ会!

こんにちわ。Pocolです。
今年もCEDEC恒例のグラフィックスプログラマーで集まってやるBBQ会(グリル会)を開催するそうです!
昨年参加された方は今年もご参加ください!

詳細については幹事のnikqさんのツイートをご参照ください。

2025/07/07更新
※チケットは完売しました。

果報は寝て待て!

こんばんわ、Pocolです。

昨年に引き続き,グラフィックスプログラマーやTAさんなどでBBQ会を開催するようです。
昨年参加された方は是非奮ってご参加ください。
詳細は,近日中に主催者よりご案内あるそうなので,お待ちください。

そんなわけで,皆で肉喰いましょう!
今年も楽しみだ…。

それではまた!

Steam Deckでのデバッグ

こんにちわ。Pocolです。

Steam Deckでのデバッグ方法について,ググってもあんまりいい情報が出てこなかったので,ここにメモしておこうと思います。

前提

  • Steamの公式ドキュメントを見ておきましょう。
  • Microsoft Child Process Debugging Power Tool をインストールしておきましょう。設定も忘れずに
  • デバッグDLLはSteam Deck実機上に含まれないので,あらかじめ転送するフォルダにデバッグ用のDLLを含めるようにしましょう
  • 開発PCとSteam Deckは同一LAN上になるように接続しておきましょう。
  • Windowsで開発しているものであれば,Proton – Experimentalにするのを忘れないように。

Visual Studioを使ったデバッグ

リモートデバッグを使用して,デバッグを行います。
まず,SteamOS Devkit OSを立ち上げて,実行ファイルやアセットなどを1つのフォルダ下にまとめておきます。
次にUploadを実行する前に下記の設定を行っています。

  • Steam Playにチェック入れる(This title requires Steam Playの項目)
  • Steam Play debugにチェックを入れる(Start Visual Studio C++ debugger service on launchの項目)
  • Wait for attachにチェックを入れる(Wait for a debug client to attach)

チェックを入れてから,Uploadボタンを押して実行ファイルとアセットファイルなどを実機に転送します。
DISMISSにならずにちゃんとアップロードできていたら,Steam Deck実機上からゲームを起動します。
ゲームはSteam Deckのホーム画面から「ライブラリでもっと見る」を選択し,「非STEAM」の項目に居る場合があるので,R1ボタンで切り替えて,デバッグしたいアプリを選択してください。

ゲームが起動したらアタッチ待ちに入るので,Steam Deck上で,Steamアイコンが表示された状態でグルグル回っている画面で止まった状態になります。
この状態で,開発用PC側からアタッチをかけます。
Visual Studioを立ち上げて,リモートデバッグを選択します(「デバッグ」>「プロセスにアタッチ」)。

「リモート認証なしーWindows」を選択して,検索ボタンを押します。
ウィンドウが立ち上がるので,その中からsteamdeckを選択します。
選択するとプロセス一覧が表示されるようになるはずなので,steam.exeを選択します。
前述したChild Process Debugging Power Toolがインストールされて入れば,ゲームにアタッチできるようになります。
アタッチ後は通常のVisual Studioのデバッグと同様に進めていけばよいです。

RenderDocを使ったデバッグ

SteamOS Devkit Client を立ち上げ,Devkitsボタンを押して,下から3番目あたりにある 「RenderDoc captures enabled」にチェックを入れておきます。
チェックを入れたSteam Deck上でデバッグしたいゲームを起動します。
ちゃんと設定がされていれば,画面左上にRenderDocのオーバーレイが表示されるようになっているはずなので,これを確認します。

続いて,開発PCからRenderDocを立ち上げ、メニューから File > Attach to Running Instanceを選択します。
Remote Host Managerというウィンドウが立ち上がるので,Steam DeckのIPアドレスを打ち込み,Addします。
Referesh Allを押して,更新をかけます。ゲームが立ち上がっていれば,win64_preloaderというようなプロセスがあるので,これを選択して Connect to App ボタンを押します。
コネクションが確立されたら,RenderDoc上から,Capture Frame(s) Immediately ボタンを押して,フレームキャプチャーを実行します。
キャプチャーが成功すれば,Captures collected にフレーム画面が表示されるようになります。このデータを一度開発PC上に保存しておきます。
保存の仕方はフレーム画像を右クリックしてポップアップメニューからSave を選択すればファイルダイアログが立ち上がるので,好みの場所に保存しておいてください。

次にフレームデバッグの準備をします。Steam Deck上で,RenderDocのremoteserverを起動する必要があります。
SteamOS Devkit Clientに戻り,Devkitsボタンを押して切り替え,Remote Shell ボタンを押し,ターミナルを起動します。
ターミナルが起動したら renderdoccmd remoteserver -d を打ち込み,RenderDocリモートサーバーを起動させます。
成功すれば,
Spawning a replay host listening on *…
Detaching.
というようなメッセージが表示されるはずです。
次に開発PC側のRenderDocの接続設定を変更します。
RenderDocウィンドウの左下にReplay Contextがあるので,これを接続しているSteam Deckに変更してください。
接続できれば,ステータスバーが Remote server ready というように表示が変わるはずです。

ここまで来たら,あとはいつも通りです。
キャプチャーしたフレームを選択すると,ドローコールなどが見えるようになるので,通常通りにグラフィックスデバッグを進めていきます。

おわりに

かなり設定が面倒ですが,これでデバッグが進められるようになるはずです。
デバッグDLLがなかったり,依存DLLが無いとサイレントでゲームが落ちるようなので,まずはちゃんと起動する状態にするのと,RenderDocのフレームキャプチャーしても落ちない状態に持っていくのが,難所だったりするので頑張ってください。

またカスタムビルド

どうしてもエディタとしてVisual Studioを使いたいPocolです。

一番簡単なカスタムビルドのメモです。
.vcxprojをテキストエディタで開いて,一番下のほうに次ような感じでコマンドを挿入します。

  </ImportGroup>
  <Target Name="Build">
      <Exec Command="call build.bat" />
  </Target>
  <Target Name="Clean">
      <Exec Command="call clean.bat" />
  </Target>
</Project>

ちなみにExecタスクのドキュメントは下記ですので,細かい設定を追加した場合は下記を参考にしてください.
MSBuildリファレンス > タスクリファレンス > Execタスク
https://learn.microsoft.com/ja-jp/visualstudio/msbuild/exec-task?view=vs-2022

Visual Studio上からリビルドを実行した場合は,Clean —> Build の順番で呼び出しされます。
もしリビルド自体をカスタマイズしたいなら

  <Target Name="Rebuild">
    <Exec Command="call rebuild.bat" />
  </Target>

とやってあれば,自前にリビルドコマンドに変更できます。

実行時のコマンドのカスタマイズは,通常のVCと同じようにプロパティから変更すれば良いと思うので,それでやればよいかと思います。
…というわけでカスタムビルドのメモ書きでした。

どっかで

クリックしてtede-msbuild-2.0.pdfにアクセス

とか

あたりを参考にもうちょいちゃんとしたものを今後改造してみたいと思います。

DREDとAftermathのサンプルプログラムを作りました。

こんばんわんわん、Pocolです。

X(旧Tiwtter)でも書いたのですが,DRED(Device Removed Extended Data)のサンプルプログラムを書きました。
サンプルは以下に置いておきました。
https://github.com/ProjectAsura/D3D12Samples/tree/master/D3D12_DRED

DREDなんですが,意外とまともなドキュメントが無いです。ドキュメントあるんですけども,わかりづらい,「この変数の意味は?」みたいな痒いところに手が届くものが無い感じがしますね。(単純に、ドキュメントみて理解できない私がアホなだけなんですが…)
…というわけで,コードを書いてみました。
仕事で使っているのはちゃんと,Push/Popの入れ子とかも考慮しているやつですけども,まぁええでしょ。こまけぇこたぁいいんっすよ。
結局,DREDのサンプルで困るのは「これちゃんとGPUクラッシュ時に出るの?」という所で,故意にGPUクラッシュさせるようなプログラムがなかなかネットで見つからない。
それだと,動作確認に困るので,GPUクラッシュさせるプログラム書きました。
ここ最近,ずっとGPUクラッシュの調査していたので,どうやれば簡単にGPUクラッシュを引き起こせるかなどのノウハウが溜まったので,その知見を活かして書きました。
一番よくある例,実行中にテクスチャを解放しちゃうやつ。これが一番良くあるので,Tボタン押したら,テクスチャをRelease()するようにしました。これで簡単にPageFaultのGPUクラッシュが発生します。TDRはレジストリいじっている場合は,発生までに時間かかるし,意外とGPU側でちゃんと対処してくれちゃったりする場合もあるので,無理やりやろうとしても意外と発生しなかったりします。サクッといかない。
DirectX-Samplesにはhttps://github.com/microsoft/DirectX-Graphics-Samples/tree/master/Tools/DXGIAdapterRemovalSupportTestというやつもあるみたいですが,こっちは触ったことないんで良く分からんっす(詳しい人教えてください)。

…で馬鹿の一つ覚えみたいな感じなんですが,PageFaultを発生できるようになったので,NVIDIA Aftermathのサンプルも書きました。
一応クラッシュ発生時に,ShaderBinaryとShaderPDBを吐き出して,クラッシュログを調査できる感じにしてみました。私のサンプルの場合は,クラッシュが発生している該当シェーダだけを出力するので,そんなにクラッシュダンプ出力に時間はかからないと思います(仕事でつかっているやつは,別の人が既に実装されたやつなんで,全部のシェーダのバイナリとPDBを出力しやがるんで,時間とディスク容量を食いまくって,困るんですよね。直すのは面倒ですし、時間の余裕もないので直す気はサラサラないです)。
サンプルプログラムは下記にあります。
https://github.com/ProjectAsura/D3D12Samples/tree/master/D3D12_NvAftermath
時間があれば,解説書いてもいいんですが,残念ながら,その時間がないのと,若干仕事のせいで鬱気味なのでやる気が起きないっす。(どうせみんなUEやらUnityつかうでしょ?こういう直叩きするひとがもう日本じゃ少数だから,親切に書いてあげても意味が無いんですよ。見る人いないから…)

…というわけで,リリースして精神的に落ち着いたら,のんびりゆったり解説を書こうかなと思います。
まぁ,そんなの期待する人はほぼいないと居ないと思いますが。