
2021年もオンライン開催となったCEDEC2021。PS5におけるレイトレーシング技術を解説する「レイトレーシング ~ 基礎とPS5における枠組み ~」セッションが実施されました。
登壇者にはソニー・インタラクティブエンタテインメントのグラフィックスエンジニアである渡部心氏が登壇。同氏は、SIEのレイトレーシングライブラリ開発に関わっている人物です。
レイトレーシングとは?
レイトレーシングは様々な意味を持っているなかで共通しているのは、レイ(光線)をトレース(追跡)して何らかの形状との交差判定を行う動作です。一般的なレイトレーシングAPIは、PlayStationのレイトレーシングライブラリだけでなく、DirectXレイトレーシングやVulkanレイトレーシングなどがあります。


古典的レイトレーシングは、レンダリングの応用でスライド左の「いかにもなCG」というビジュアルが生成されます。モンテカルロレイトレーシングは、分散レイトレーシングの応用で視点からのレイトレースだけでなく光源からのレイトレースも含みます(一方で、モンテカルロレイトレーシングも登場から20年以上経つ古さもある)。


また純粋な意味でのレイトレーシングは、単なる交叉判定でなので応用範囲は広く物理シムやサウンド、NPCのAIなども挙げられます。また本セッションで扱うレイトレースは、より純粋で正確なものを指します。




プログラミングモデルの場合
レイトレーシングには、Ray GenerationシェーダーとClosest-Hit/Any-Hitシェーダー、そして、Intersectionシェーダー3つがあります。これらはレイトレース中に発生するイベントを現し、シェーダーそれぞれの動作条件は以下のスライドの通りですが、レイに何もヒットしなかったらMissシェーダーが処理をします。




従来のリアルタイムレンダリングでは、オブジェクトやマテリアルごとにテクスチャーなどをセットしてシェーダーを起動していましたが、レイトレーシングではシーン全体を同時に扱います。

またレイトレーシングは専用パイプライン以外でも使用可能。この場合はインラインレイトレーシングと指し、ピクセルシェーダーから呼び出せます。

高速化と諸問題
前述の通りレイトレーシングは光線を発射し追跡して形状を把握しますが、総当たりで交叉判定を行っていますと途方もない時間が掛かってしまうため(100万三角形があったら100万交叉判定が必要)、実用的なレイトレーシングとしてAcceleration Structure(高速化機構)を利用する必要があります。その高速化機構ではBounding Volume Hierarchy(BVH)を使うのが典型的です。
そのBVHが交叉判定する手順ですが、全体を囲むAxis Aligned Bounding Box(AABB)からルートノードを作成し、何らかの基準を用いて分割し、さらに分割することで木構造が出来上がります。レイの交叉判定では、スライド5へ当たるようにレイが飛んでいるために、全体の0→左半分の1→左半分の大体を占める4→実際に当たっている7へと処理が進んでいます(大雑把な広範囲から狭く詳細に分岐する交叉判定が行われる)。

もちろん物体の形状が移動したり変形する場合もあるため、AABBとの矛盾を解消する必要があります。ASの更新も同じようにAABBを階層的に更新すると、ASを再構築するより高速に処理可能です。

ゲームでは多くの物体が動くために1つのASと更新処理だけでは性能面の負荷で厳しく、各オブジェクト毎に作ったASとTransform(位置と姿勢)に加え、さらにASを組み上げる「二段階AS」手法が使われます(トップレベルはシーン全体、ボトムはオブジェクトごと)。この手法では一部の物体が動いても全てのASを再構築しないために物体が変更されても負荷が小さくなります。




リアルタイムレイトレーシングの諸問題
現時点でゲームにおけるレイトレーシングは新しい技術であることから、ノイズやカリングなど多くの未解決問題があります。その1つが先に解説されたASのリビルドかアップデートにするかの選択です。一般的なものでは基本リフィットでたまにリビルドすることが挙げられますが、TLAS/BLASでも事情が異なります。
レイのコヒーレンシー(類似性の高さ)について、矢印がバラバラのインコヒーレント状態だと負荷が高くなります。この対策としてレイのソートすることがトラバーサル性能の向上に繋がりますが、最適なトレードオフを探す必要があるとのこと。



PlayStationにおけるレイトレーシングライブラリ
PSにおけるレイトレーシングライブラリはAS管理とトラバーサルを行うライブラリが提供され、複雑な実装無しにPS5のレイトレーシングを使い始められるようになるとのこと。またツールの難易度は、一般的なレイトレーシングAPIと同様で、細かなコントロールも可能です。


またライブラリに関しては、ホストPC用ツールによるオフラインASビルダ-やローレベルなレイトレ解説サンプル、各種API説明用サンプル、レイトレ応用のサンプル、そして各種ドキュメントも付属しています。最後に今回の内容を振り返りセッションを終えました

セッションの内容としては題名の通りレイトレーシングの基礎的な説明でしたが、振り返ってみるとPS5で採用しているレイトレーシングライブラリに絡んだ内容を言及しているように思えます。また公式で公開されているPlayStation 5のレイトレーシングを説明する短い映像を合わせて見ると、半透明の影など今回の説明をより理解しやすくなるかもしれません。