
9月4日から9月6日まで神奈川のパシフィコ横浜で開催されたCEDEC 2019。リアルタイムレイトレーシングの基礎を説明するセッション「「シェーダーでかんたんにわかる!」DirectX リアルタイムレイトレーシング入門」のレポートをお届けします。

このセッションには、ディライトワークスの研究開発部 Real Time Computingユニットのリードリサーチャー鈴木克史氏が登壇し説明を行いました。このセッションはこれからDirectXのレイトレーシングを始める開発者やデザイナー向けのものです。
■レイトレーシングのパイプラインとはどんな構造か?
初めにレイトレーシングの構造を説明する30秒ほどのデモ映像を披露しました。レイトレーシングは、新しく定義された関数「RayGeneration」でレイ(光線)を生成し、「TraceRay」でレイを飛ばし、三角形の交差で判断する流れを持つパイプラインです。


飛ばしたレイが三角形に交差した場合は「Closesthit」シェーダーを、交差しなかったらMissシェーダーを使用します。また半透明はAny-hitシェーダー、レイの交差判定はIntersectionシェーダーです。


「Closesthit」シェーダーはレイについてまわるオブジェクト「RayPayload」と「MyAttribut」が入り事前に定義が必要で、フォグ描写ではRayTCurrentで深度情報が取れます。これらはレイトレーシングのシェーダーだからといって新しい事を多く覚えなければという訳で無く、ラスタライザーで使っていた従来のテクニックが使えると説明しました。

RayTraceShadowはセルフシャドウとドロップシャドウが同じアルゴリズムで描画出来るもので、それぞれ別に描画もできます。レイトレースシャドウの原理は、スクリーンレイ(プライマリレイ)から光源に向かってシャドウレイを飛ばし何も遮る物がなければ影無し、何かにぶつかったら影と見なす原則で働いています。



そのためレイトレースシャドウのアルゴリズムでは、シャドウ例を飛ばしオブジェクトに交差したらClosestHitシェーダーを飛ばしPayloadの値を書き換え、遮蔽がなければMissシェーダーで書き換えず遮蔽情報を使いシェーディングを行います。これらのシャドウは2段階のステップという短いコードで作れるのが特徴です。


レイトレースリフレクションは、シャドウと同じようにオブジェクトに反射した時と同様のアルゴリズムで書けることがレイトレース最大の特徴と語ります。リフレクションもレイを飛ばしてオブジェクトに交差していない場合ならMissシェーダー、交差したならClosestHitシェーダーと動作を行います。



ここでレイトレースアンビエントオクルージョン(RTAO)を紹介。スクリーンスペースアンビエントオクルージョン(SSAO)とRTAOを比較すると、SSAOは遮蔽が小さく陰表現が一部ですが、RTAOは床からの遮蔽情報を取得していることも含め全体的に立体感が出ています。RTAOは3次元情報からレイを飛ばして描写していますが、SSAOは深度情報だけで描写しているため床の遮蔽情報を取得出来ないために違いが出てくることが特徴です。


車と家のオブジェクトではSSAOは暗くなく、RTAOは暗い部分がしっかりと描写され判定して計算されているのが、同じ陰の描画からわかります。しかしながらドロップシャドウを適応すると見た目的に変わらないこともあるためケースバイケースで対応する必要があるようです。

ここでRTAOの原理説明に入りました。RTAOはレイの衝突点から法線方向を起点に反球面上に無数のシャドウレイを作りますが、レイの数が多くなると計算量が増え重くなります。そのためランダムな方向に飛ばすことで近似させる必要があります。


RTAOの計算結果では、何も処理をかけていない状態だと描画が梨地のようにザラザラとしていますが、ここで2次元的にフィルターをかけるデノイズ後なら自然と見えるようになります。この場合は、シャドウレイとほぼ同じで、シャドウレイを覚えているならすぐ習得出来る事に加え、RTAOでは複数レイを飛ばして平均を取ると説明しました。



ここで図を用いてデノイズ処理を行った比較を表示。処理をすればするほど自然でなめらかになっています。サンプル数は1ピクセルのレイ数を増やすことでノイズ除去。サンプル数上げるのが影響するが重くなりますが、この調整が重要です。


最後にパイプラインを中心に5つ描画例を紹介。加えて学習本やコース、サンプル映像を紹介してセッションを終了しました。

