はじめに
10月11日(金)から10月13日(日)に初島で開催されたレイトレ合宿10に参加してきました! こちらはレイトレ合宿までの準備と当日の振り返り記事になります。
レイトレ合宿に参加するまで
レイトレ合宿は自作レンダラーで描画されたレンダリング結果(動画作品/画像作品)の美しさを競うオフライン集会です。 参加者は事前にレンダラーを提出し、合宿当日は作品の発表やセミナー、レクリエーションなどを行います。
今年は初島で開催されました!
私はレイトレ合宿8、レイトレ合宿9と参加し、今回で3回目の参加となりました。
過去の参加レポート
- レイトレ合宿8:レイトレ合宿8参加レポート - kugi's notebook
- レイトレ合宿9:書きそびれて無い、今年は書いた、えらい
まずは「今回の目標」から共有したいと思います。
今回の目標
今回の目標は、『ハードウェアレイトレーシングに入門する』でした。
レイトレ合宿8では、
今回提出した作品です!
— kugi (@kugi_masa) 2022年9月4日
目標だった蛍光現象は出せたけどノイズが多めになってしまったので来年はデノイズ頑張る!!!💪#レイトレ合宿 pic.twitter.com/F0Vs0oJFa7
レイトレ合宿9では、
今年はGPUレンダリング挑戦!!
— kugi (@kugi_masa) 2023年9月3日
WebGPU(Native C++)のコンピュートシェーダーで実装し15位でした!
お疲れ様でした🧘♂️#レイトレ合宿 pic.twitter.com/g5yfEjXnm7
CPU 、GPU (ComputeShader) ときたので、 今年はレイトレーシングパイプラインに挑戦してみたいと思い、 DirectX Raytracing(DXR)を用いてハードウェアレイトレーシングに入門しました。
制作の過程
今回も制作までの記録をNotionにメモ書きとして残していきました。
前回、前々回と比べると若干スロースタートでした...
レギュレーションとしては制限時間256秒。
今回は静止画も提出可能ではありましたが、 今回も動画を作りたかったので、レギュレーション最高枚数である画像600枚(10秒 60fps)を目指し進めました。
DirectX Raytracing Programming Vol.1
まずは技術書典12で購入したtechbitoさんの『DirectX Raytracing Programming Vol.1』を読みながらサンプルを動かしつつ入門し始めました。
とはいえ、DirectX12に触れるのも初めてだったため、序盤はドキュメント、DirectX12の参考書やブログ記事を参考にまずはレイトレでの三角形の描画を目標に進めていきました。
- DirectX 12の魔導書 3Dレンダリングの基礎からMMDモデルを踊らせるまで(川野 竜一)|翔泳社の本 (DirectX12の参考書 by きれいなツチノコさん)
- Direct3D 12 入門 (入門記事 by Pocolさん)
- DX12 Raytracing tutorial - Part 1 | NVIDIA Developer (NVIDIAのDXRチュートリアル)
- (ChatGPT先生)
三角形描画まで
初めて触れる内容が多かったこともありCMakeでシェーダーコンパイルするための記述やGPUハンドルのオフセット忘れなど、つまづくことが多かったです。
ようやく三角形描画までのパイプライン実装まで終わったと思った矢先、 背景は描画されているのに、三角形が描画されないという状況に陥ってしまいました...。
NVIDIA Nsight Graphicsでサンプルプロジェクトと自作レンダラーをキャプチャし比較してみたところ、
TLAS作成時に、作成済みのBLAS用バッファに再度セットしていました。
また、以前までの開発はMac環境でWindowsアプリケーション周りの実装に慣れていなかったため、 オフスクリーンレンダリングの対応にも時間を取られました。 提出するレンダラーはEC2の実行環境で実行される際、ウィンドウやダイアログを出してはいけないため、 Windowsアプリケーションのウィンドウを出さずに描画する必要がありました。
今回はReleaseビルドだった場合、ShowWindow
関数に渡すnCmdShow
の値をSW_HIDE
に設定することで対応しました。
#ifdef _DEBUG int nCmdShow = SW_SHOWNORMAL; #else // _DEBUG // Release版ではウィンドウを出さない int nCmdShow = SW_HIDE; #endif ShowWindow(m_hWnd, nCmdShow);
モデル描画まで
レイトレ合宿8、9とプリミティブなモデルしか描画できなかったので、 techbitoさんの書籍を参考にglTFを用いたモデル描画に対応しました。
※ glTFローダーにはtinygltfを使用しました。
モデルには今年のSIGGRAPHのReal-Time Live!で紹介されていた、Rodinという画像1枚からマテリアルと3Dモデルを生成できる生成AIを用いてglTFデータを作成しました。
複数オブジェクト描画のテストとしてBlenderで作成した机もシーンに加え、 ひとまず頂点法線を表示し、imguiを導入しカメラ調整機能を実装しました。
いよいよ1週間を切りそうというタイミングでしたが、 この時点ではまだパストレや光源、マテリアル実装が間に合っていませんでした...。
提出作品『Chill in the Box』
残り日数が短かったため、マテリアルはLambert Diffuseと割り切り、表現したいシーンを考えアニメーション実装に時間を割きました。
せっかくglTFを使っているのでアニメーションをBlenderで作成して読み込めるようにしたかったですが、 時間もなかったので、下の画像のような構成のものをハードコーディングしました。
パストレ、IBL(Image Based Lighting)、アニメーションの実装が大体出来上がり、 残りの時間で過去の作品では実装できていなかったNEE(Next Event Estimation)の実装に取り掛かりましたが、 なぜかモデルでの反射成分の色味が薄くやや薄暗い感じになっていました。
朝の通勤電車で参考にさせていただいたkiNaNkomotiさんの記事を再度読み直しながら、
GitHub Mobileでコードを見直していると、
バグに気づいた…🐛
— kugi (@kugi_masa) 2024年10月7日
帰って速攻fixしたぃぃ
NEEの処理で衝突点から光源方向へレイトレースし、光源と接続できた場合に寄与の計算をした後、次の衝突点への移動をせずに終了してしまっていることに気がつきました。
/// 光源サンプリング /// 光源方向へレイトレースして、光源と接続できた場合 if (!TraceShadowRay(worldPos, lightDir, lightDist, payload.seed)) { /// 寄与の計算 ///トレースを終了←してはだめ } else // ← ここのelseが不要だった { /// 方向をサンプリング /// throughputの計算 /// 次の衝突点に移動 }
NEEで光源と接続できた場合、早々にトレースを終了してしまい、 throughputの計算もできていなかったため、反射成分が少なくなってしまっていたのだと思います。
帰宅後すぐさま修正し、無事に最終版を提出しました。
最終日はスライドをひたすら作っていました。
そして提出した作品がこちらになります。
#レイトレ合宿 10 お疲れ様でした!
— kugi (@kugi_masa) 2024年10月13日
作品名:「Chill in the Box 」
今年はDXRでハードウェアレイトレーシングに初挑戦🔥
Next Event Estimationまで実装して、結果は15位でした!
アニメーションはFully Hard Codedです🦾 pic.twitter.com/6kNGSNmYB6
また、今回のレンダラーについては下記のリポジトリに公開しています。
レイトレ合宿当日
前回のレイトレ合宿9はお寺で開催され座禅体験や精進料理など非日常を体験できましたが、 今年は今年で初島でリゾート気分な非日常を楽しめました。
Nice Boat 🛥️#レイトレ合宿 pic.twitter.com/sCCQ7Ff8kF
— kugi (@kugi_masa) 2024年10月11日
月明かりや星空がとても綺麗でした。
Moon Light 🌙#レイトレ合宿 pic.twitter.com/B3iCw3Jfo0
— kugi (@kugi_masa) 2024年10月11日
本戦
今年は22個ものレンダラが提出されました。
今年はレンダラーが22個!!
— kugi (@kugi_masa) 2024年10月12日
他の方の作品と発表聞くだけでもめちゃくちゃ楽しい🤩#レイトレ合宿 pic.twitter.com/5cpTXuke5H
私が本戦で使用した説明スライドはこちらになります。
毎年ながら他の方の作品は圧倒されるものばかりでした。
10/11~10/13に開催されたレイトレ合宿10の結果を公開しました!
— ykozw (@ykozw88) 2024年10月13日
🥇makeshift by @Shocker_0x15
🥈redqueen by @ShinjiOgaki
🥉Ether by @Eclmist
入賞された皆さん、おめでとうございます!
来年も素敵な作品に出会えるのを楽しみにしています。
🔗https://t.co/LFpLk7Rcu5#レイトレ合宿 pic.twitter.com/D7BGcHi9Dz
Gaussian Splattingを実装されたうしおさんがご自身で小舟に乗りドローンを飛ばして撮影したと聞いた時は驚きました。 すごすぎる...!
#レイトレ合宿 10 皆様お疲れ様でした、自分はレイの代わりにドローンを飛ばして自作のGaussian Splattingレンダラで4位を頂きました!
— うしお (@ushiostarfish) 2024年10月13日
セミナー資料などアップしました!
レンダラ紹介:https://t.co/eIfkjAUOGI
セミナー資料(Gaussian Splatting の解説)https://t.co/hWhjRlJw8A pic.twitter.com/XY3RyRN7kk
本戦の結果としては15位でした。 景品にはWeta Digitalの商用レンダラーMaunkaにちなんで、「たたかうマヌカハニー」を頂きました!
景品のManuka#レイトレ合宿 pic.twitter.com/zUp7eUTuhC
— kugi (@kugi_masa) 2024年10月13日
セミナー
セミナーに関しても皆さん幅広い内容の発表をされていて、どれも興味深かったです。
X(Twitter)で話題になっている#つぶやきGLSL
を解読する内容についてがむさんが発表されていて、
発表の中で、実際にtwigl.appを開いて解読される様子も見せていただきました。
マジックナンバーを変えた際の変化を見ながら、その部分の記述が何の処理をしているかを推測したり、 パターンを覚えることで解読への足掛かりになるとのことでした。
ベストプレゼンター賞はholeさんでNaNやInfについての発表をされていました。
度々悩まされるNaNですが、 Quite NaNとSignaling NaNという2種類のものに分類されるということを初めて知りました。 また、NaNが絡む演算のコンパイラごとの挙動の違いについても調査されていてとても面白かったです。
私は蛍光現象について15分枠で発表しました。
セミナースライドを公開しました!
— kugi (@kugi_masa) 2024年10月14日
今回は蛍光について話しました🟢#レイトレ合宿https://t.co/cEr8WlbxOV pic.twitter.com/WgFX3YeJsy
(今回も蓄光石や蛍光マーカーを忍ばせていました)
Fluorescence and Phosphorescence pic.twitter.com/G3Fb6j0xVI
— kugi (@kugi_masa) 2024年10月13日
レクリエーション
Sponza ジグゾーパズル対決
今年のレクレーションは部屋対抗Sponzaのジグゾーパズル対決でした。
Sponzaのジグソーパズル🧩難しすぎる😱 #レイトレ合宿 pic.twitter.com/NBhu0qc5mC
— がむ (@gam0022) 2024年10月12日
がむさん、Samuelsさん、私のチームは最後の2チームまで残りましたが、惜しくも最後のEvaluationで敗退... 優勝チームにはCornell Boxのジグゾーパズルが贈られました!
レクレーションで使用したパズルはチームの誰かが持って帰って良いとのことだったので、 私たちのチームでは私が頂くことになりました。
帰宅後完成されていたYoshi's Dreannさんは7時間かかったそうです....!
Crytek Sponzaパズル(500 pieces)完成!
— Yoshi’s Dreann (@TTRS_Yoshi_CG) 2024年10月14日
所要時間: 7時間 #レイトレ合宿 pic.twitter.com/0QxcQ1uvw9
Silent NaN の歌のライブ
ジグゾーパズル以外には、holeさんとykozwさんでAI生成されたNaNを称える歌のライブがありました。
今回の #レイトレ合宿 では @ykozw88 さんといっしょに"AI"の力を借りてNaNを讃える歌 "Silent NaN" をつくりましたhttps://t.co/oGPaefork2
— hole (@h013) 2024年10月14日
"No solution, just a NaN star."、"Live with ambiguity."あたりがお気に入りの歌詞です。
サイリウムも配られ、会場は大盛り上がりでした。
The song of Silent NaN Live🎤#レイトレ合宿 pic.twitter.com/B4uS233bPf
— kugi (@kugi_masa) 2024年10月11日
#レイトレ合宿 pic.twitter.com/7u0dgH8O5h
— ハガ (@hagat) 2024年10月11日
とてもいい写真。
まとめ
レイトレ合宿10について振り返りました。
今回はDXRでハードウェアレイトレーシングに入門し、これまでのプリミティブな形状からも脱出できました。 そろそろLambertDiffuseからは卒業して、Specularな材質もレイトレしていきたいです。
毎年刺激が多く、皆さんのレベルの高さに圧倒されるばかりです。 私もできることを一つ一つ増やしていきたいです。
運営の皆さん、参加者の皆さんありがとうございました!
fin.#レイトレ合宿 10 pic.twitter.com/YN5EiktvB6
— kugi (@kugi_masa) 2024年10月13日