
Evergineにおけるレイトレーシング
はじめに
レイトレーシングは、レンダリングのリアリズムを向上させる技術です。リアルタイムレンダリングで最も普及している技術はラスタライゼーションであり、長年にわたり、様々な表面、光、影、反射など、世界のあらゆる詳細をシミュレートするために取り組んできました。一方、レイトレーシングは、現実世界のこれらすべての詳細を最も高い近似度でシミュレートできる技術でしたが、リアルタイムレンダリングでの使用には非常にコストがかかりました。
2018年、NvidiaはRTXテクノロジーを搭載した新しいグラフィックスカードシリーズを発表し、ハードウェアを使用してレイトレーシング技術の計算コストを削減しました。これにより、リアルタイムでのレイトレーシング使用が可能になり、従来のラスタライゼーション技術に代わる優れた選択肢を提供します。
ソフトシャドウ、リアルタイムリフレクション、グローバルイルミネーションなどの視覚効果は、従来のラスタライゼーション技術では実装が難しい一方で、レイトレーシングを使用すれば比較的容易に実装できます。
2019年、2020年、2021年と、レイトレーシングはAMDやIntelなど他のグラフィックスカードベンダーにも普及しており、将来的にはレイトレーシングが標準技術となることが目標とされています。
レイトレーシング技術は、EvergineのローレベルAPIの一部としてサポートされています。ローレベルAPIは、DX12、DX11、Metal、Vulkan、OpenGLといった主要なグラフィックスAPIとの共通インターフェースです。ただし、レイトレーシングのサポートは現在、DirectX12とVulkanバックエンドでのみ利用可能です。
Evergineチームは、DirectX12 DXRとVulkan Raytracing APIを単一の共通APIに統合しました。そのため、EvergineのローレベルAPIを使用してプロジェクトを作成し、後でDX12またはVulkanバックエンドで実行できます。
EvergineのレイトレーシングローレベルAPIの可能性を示すために、Evergineのリリースと同時に、Githubからダウンロード可能なパストレーサーデモを作成しました。このデモには、レイトレーシング技術を使用して実装されたソフトシャドウ、アンビエントオクルージョン、グローバルイルミネーション、アンチエイリアシングなどの興味深いエフェクトが含まれています。
次のセクションでは、これらの各エフェクトの実装方法について説明します。

まず、カメラはピクセルごとに1本のレイを投射します。各レイはサーフェスに当たるか、当たらないかのいずれかです。レイがサーフェスに当たった場合、色の結果はサーフェスマテリアルから取得され、レイが当たらなかった場合、結果は背景色になります。
ソフトシャドウ
レイトレーシングで影を実装するには、サーフェスのヒットポイントから光源に向けて新しいレイを投射する必要があります。この新しいレイが光源に到達する前に何かに衝突した場合、レイは「影の中」という値を返し、そうでなければ「光の中」という値を返します。

これは最も単純なケースで、ハードシャドウを生成しますが、ソフトシャドウを生成するにはさらにいくつかの要素を追加する必要があります。私たちの実装では、サーフェスポイントから光源に向けて複数のレイを投射します(このデモでは光源を1つだけ使用しています)。光源は簡単のため球形であり、レイはサーフェスのヒットポイントから光源に向けて円錐状に投射されます。
そして、影の色は各レイの組み合わせ結果に依存します。半影領域は、一部のレイが「影の中」を返し、他のレイが「光の中」を返す場合の結果です。

次の画像では、異なる光源半径を使用して生成された影を比較することで、半影領域を確認できます。

アンビエントオクルージョン
アンビエントオクルージョンは、近くに物体があるために光を遮ったり閉ざしたりする傾向がある領域をシミュレートし、それによってそれらの領域が暗く見えるようにします。
私たちのアンビエントオクルージョンの実装は、サーフェスの法線に沿った半球内で、サーフェスのヒットポイントから複数の短いレイを投射することで構成されています。シャドウレイと同様に、これらのレイはポイントの近くに何かがあり、光のバウンスを遮るかどうかを検出します。

次の画像では、異なるアンビエントオクルージョンレイの長さを使用した結果を確認できます。

グローバルイルミネーション
現実世界での光の振る舞いは、光源からレイを放射し、それがサーフェスに当たることでシミュレートできます。このレイのエネルギーの一部はサーフェスに吸収され、別の一部は反射されて新しいレイを生成し、最初のレイの全エネルギーが吸収されるまで再帰的に繰り返されます。

バウンスパラメータを用いることで、光線がサーフェスで反射する回数をシミュレートできます。バウンスによる色の結果はサーフェスカラーに加算され、例えば赤いオブジェクトが近くにある別のオブジェクトを赤く染めるといった効果を生み出します。
次の画像では、グローバルイルミネーションの出力結果として、一部の領域が近接するオブジェクトの色によって着色されている様子を確認できます。

アンチエイリアシング
アンチエイリアシングとは、画像のジャギー(ギザギザ)を除去することです。これらのジャギーは、出力画像のピクセルグリッドが有限であるために生じます。
これを実現するには、カメラからピクセルごとに複数のレイを飛ばし、その結果として平均色を取得する必要があります。ピクセルごとに1本のレイのみを飛ばす場合、カメラはピクセルの中心に合わせてレイを飛ばします。アンチエイリアシングを実装するには、ピクセル内でランダムな方向に複数のレイを飛ばします。私たちの実装では、このような目的で一般的に使用されるHaltonシーケンスを利用しています。

ピクセルごとに複数の光線を組み合わせた結果を次の画像に示します。

今後の予定
現在、レイトレーシングは進化を続ける技術ですが、その結果は非常に印象的であり、ラスタライゼーションレンダリングの結果を上回っています。すべての最新グラフィックスエンジンは、レイトレーシングを使用するようにレンダラーを更新する過程にありますが、統合コストは高く、旧来のグラフィックスカードをサポートし続けるという目標があるため、レイトレーシングの使用は代替手段にとどまっています。最新エンジンの多くは、レンダリングにラスタライゼーションとレイトレーシングを併用するハイブリッドレンダラーを実装しています。
Evergineは、レイトレーシングを統合した最初のC#エンジンです。私たちの目的は、ユーザーが産業プロジェクトや製品で活用できるよう、最新のグラフィックス技術を提供することです。
ロードマップに従い、私たちはレイトレーシングの開発を継続し、高レベルAPIでの利用を可能にし、Evergine Studioとの統合も提供する予定です。

