ハードウェアレイトレーシング(RTX・DXR)
GPUがレイトレーシングをリアルタイムでこなせるようになった仕組みを、RTコア・加速構造・専用パイプラインから理解できます。ラスタライズとのハイブリッド構成やDXR/Vulkanの使い分けまで押さえます。
- 1.RTコアは加速構造(BVH)の探索と三角形交差判定を専用回路で行い、シェーダコアを陰影計算に専念させることでレイトレーシングをリアルタイム域へ引き上げる。
- 2.加速構造は二段構成で、形状ごとの木を BLAS(bottom-level)として一度作り、シーン内のインスタンスは TLAS(top-level)に「BLASへの参照+変換行列」として並べるため、剛体が動いても BLAS を再利用できる。
- 3.実用レンダラは全画面レイトレーシングではなく、可視面をラスタライズで解き、反射・影・GI だけをレイトレーシングで補うハイブリッド構成が主流で、DXR と Vulkan Ray Tracing がその API 基盤。
なぜハードウェア化が転機だったのか
レイトレーシングの原理(/graphics/ray-tracing-principles/)そのものは古く、写実に強い一方で計算コストが大きいのが宿命でした。1 本の光線ごとに「最も近い交点」を求める処理は、加速構造(/graphics/spatial-structures-bvh/)による枝刈りを前提にしても、木のトラバーサルと三角形交差を膨大に繰り返します。この二つは分岐が多くメモリアクセスが不規則で、SIMT 実行の GPU が最も苦手とする処理です。
NVIDIA の RTX(Turing 世代、2018 年)以降が持ち込んだのは、この BVH トラバーサルと三角形・AABB 交差判定だけを専用ハードウェア(RTコア)に切り出す という発想です。汎用のシェーダコアで木をたどると分岐発散とメモリレイテンシで性能が出ませんが、固定機能の RTコアなら交差判定を高スループットでこなせます。シェーダコアは「交点で何色になるか」という陰影計算に専念でき、両者を並行して回すことでレイトレーシングがリアルタイム域に入りました。
RTX は NVIDIA のハードウェア/ブランド名(RTコアを持つ GPU 群)です。DXR(DirectX Raytracing)は Microsoft が定めた Direct3D 12 のレイトレーシング API、Vulkan Ray Tracing は Khronos の同等の標準 API を指します。API は特定ハードウェアに依存せず、RTコアを持つ GPU ではドライバがトラバーサルを RTコアへ、そうでない GPU ではシェーダ実装(フォールバック)へ振り分けます。
加速構造の二段構成(BLAS / TLAS)
ハードウェアレイトレーシングの中核は、アプリが構築しドライバ/RTコアが読む 加速構造(acceleration structure) です。API は内部フォーマットを隠蔽し、構造は必ず二段に分かれます。
| 段 | 正式名 | 何を持つか | 更新頻度 |
|---|---|---|---|
| 下位 | BLAS(bottom-level) | 実際の三角形(または AABB)から作った BVH。形状そのもの | 形状が変わらなければ作り直し不要 |
| 上位 | TLAS(top-level) | 各インスタンス(BLASへの参照+変換行列+ID)を並べた BVH | カメラ・物体が動くたびに毎フレーム再構築 |
この分離が効くのは、剛体変換が形状を変えないからです。動く物体でも三角形の相対配置は不変なので、重い BLAS は一度だけ構築して再利用 し、フレームごとに更新するのは「どこに置くか」だけを持つ軽い TLAS に限れます。同じ BLAS を異なる変換行列で TLAS に複数回参照させれば、木を 1 本作るだけでインスタンス化(同じメッシュを大量配置)が成立します。
構築は明示的な API 呼び出しで、build(ゼロから作る)と refit(木構造を保ち AABB だけ再計算)を選べます。DXR ではビルド時のフラグで方針を指定します。
加速構造ビルドのフラグ(DXR: D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS):
PREFER_FAST_TRACE : トレース最速。SAH 等で品質重視に構築(静的・長寿命向け)
PREFER_FAST_BUILD : ビルド最速。品質は落ちる(毎フレーム作り直す TLAS 向け)
ALLOW_UPDATE : refit を許可(変形メッシュの BLAS 向け)
ALLOW_COMPACTION : ビルド後に不要領域を詰めてメモリ削減
変形するメッシュ(スキニングなど)では BLAS を ALLOW_UPDATE 付きで作り、毎フレーム refit で AABB のみ更新します。ただし refit は木の構造を変えないため、大きく変形するとボックスの重なりが増えてトラバーサル効率が徐々に落ち、定期的な再構築が要ります。加速構造の理屈は空間データ構造(/graphics/spatial-structures-bvh/)と共通です。
レイトレーシングパイプラインとシェーダ
固定機能のトラバーサルだけでは絵は出ません。「光線をどこから飛ばすか」「交点で何をするか」はアプリが書くシェーダで決めます。DXR / Vulkan RT は従来のラスタライズパイプラインとは別の レイトレーシングパイプライン を定義し、光線のライフサイクルに沿った複数のシェーダステージを持ちます。
| シェーダ | 起動タイミング | 役割 |
|---|---|---|
| Ray Generation | ディスパッチの起点 | 各ピクセル等で最初の光線を生成し TraceRay を呼ぶ。結果を画像に書き出す |
| Intersection | カスタム形状に光線が入ったとき | 三角形以外(手続き的な球など)の交差を自前で解く。三角形は組込み処理 |
| Any-Hit | 交点候補が見つかるたび | アルファテスト等で交点を採用/棄却。影の遮蔽判定にも使う |
| Closest-Hit | 最も近い交点が確定したとき | 陰影・材質評価。ここから反射・影の二次光線を再帰的に TraceRay できる |
| Miss | 何にも当たらなかったとき | 背景色・環境マップを返す |
処理の骨格は Ray Generation シェーダが TraceRay(Vulkan では traceRayEXT)を呼ぶところから始まります。呼び出しは非同期の「発射」で、RTコアがトラバーサルを進め、交点の状況に応じて上記シェーダをドライバがディスパッチします。
TraceRay(加速構造, フラグ, レイ, ペイロード) の内部の流れ:
加速構造を RTコアがトラバーサル
交点候補ごと → Any-Hit(採用/棄却を判定, 省略可)
三角形以外 → Intersection(交差を自前計算)
最近交点が確定 → Closest-Hit を起動
交点なし → Miss を起動
※ Closest-Hit / Miss から再び TraceRay を呼べる(反射・影・GI の二次光線)
シェーダ間の値の受け渡しは ペイロード(呼び出し側が定義する構造体)で行い、再帰の深さは API とハードウェアの上限に縛られます。どのメッシュのどのマテリアルを使うかは シェーダバインディングテーブル(SBT/DXR ではシェーダテーブル) が対応付けます。これは「この BLAS のこのジオメトリに当たったら、この Closest-Hit シェーダとこのリソースを使う」という索引表で、インスタンスごとに材質を切り替える仕組みです。GPU 上でのシェーダ実行の一般論はプログラマブルシェーダ(/graphics/shader-programming-model/)を参照してください。
一次光線は隣接ピクセルで似た方向・似た交点をたどりますが、反射・GI の二次光線は交点ごとにバラバラの方向へ飛び、当たる BLAS も実行される Closest-Hit シェーダも隣のスレッドと食い違います。これが実行発散とメモリ発散を生み、RTコアがあってもレイトレーシングが重い根本要因です。マテリアルでソートして同じシェーダをまとめて実行する等の工夫が効きます。
ラスタライズとのハイブリッド
現代のリアルタイム描画は「全画面をレイトレーシングで解く」わけではありません。可視面(G バッファ)の生成はラスタライズが桁違いに速いため、そこはラスタライズに任せ、ラスタライズが不得意な効果だけをレイトレーシングで補う ハイブリッド構成が主流です。前段のパイプライン全体像は描画パイプライン(/graphics/forward-deferred-rendering/)と重なります。
| 効果 | ラスタライズでの従来手法 | レイトレーシングでの解き方 |
|---|---|---|
| 影 | シャドウマップ(解像度・ピーターパン問題) | 交点から光源へシャドウレイを飛ばし遮蔽を厳密判定 |
| 反射 | 環境マップ/SSR(画面外は映らない) | 反射方向へ光線を飛ばし画面外の物体も映す |
| 環境遮蔽/GI | SSAO/ライトマップ(動的物体に弱い) | 半球へ光線を飛ばし到達光を積分(RTGI) |
典型的なフレームは、まずラスタライズで G バッファ(位置・法線・材質)を埋め、その各ピクセルを起点に少数の光線を飛ばして影・反射・GI を求めます。1 ピクセルあたり数本しか飛ばせないためノイズが乗り、これを 時間的蓄積(複数フレームの平均)と AI デノイザー で滑らかにするのが定石です。原理的な積分の背景はパストレーシング(/graphics/path-tracing-global-illumination/)にあり、リアルタイムはそれを 1 サンプル近くまで削ってデノイズで補っていると捉えると見通しが良くなります。
可視面の決定は「最も手前の三角形はどれか」を Zバッファで一括に解けるため、幾何を前方投影するラスタライズが圧倒的に速い。一方、影・反射・GI は「他の物体との相互作用」であり、交差判定を統一的に解けるレイトレーシングが素直です。両者を混ぜるのは、各処理を得意な方式に割り当てて全体の計算予算を最小化する当然の帰結です。
DXR と Vulkan Ray Tracing
API は二系統がほぼ同等の機能を提供し、概念はそのまま対応します。系譜の背景はグラフィックスAPIの系譜(/graphics/graphics-api-genealogy/)を参照してください。
| 概念 | DXR(Direct3D 12) | Vulkan Ray Tracing |
|---|---|---|
| 下位/上位構造 | BLAS / TLAS | 同じ(VkAccelerationStructureKHR) |
| 光線発射 | TraceRay(HLSL) | traceRayEXT(GLSL) |
| パイプライン | State Object(RT pipeline) | VK_KHR_ray_tracing_pipeline |
| シェーダ対応表 | Shader Table | Shader Binding Table(SBT) |
| 軽量版 | Inline Raytracing(RayQuery) | Ray Query(VK_KHR_ray_query) |
両 API とも、独立したレイトレーシングパイプラインを組む方式に加え、インライン方式(DXR の RayQuery/Vulkan の Ray Query) を持ちます。これは既存の頂点・フラグメント・コンピュートシェーダの中から直接トラバーサルを回し、Closest-Hit などの別ステージを介さず結果をその場で受け取る方式です。SBT やパイプライン構築が不要で単純ですが、任意深さの再帰や複雑なシェーダ分岐には向かず、影の可視判定のような単発の問い合わせに好適です。用途に応じて「フル RT パイプライン」と「インライン」を選び分けます。
定番は「なぜ BLAS と TLAS を分けるのか」。答えの骨子は、剛体変換は形状不変なので重い BLAS は再利用でき、毎フレーム作り直すのは変換行列を並べた軽い TLAS だけで済む、そして同一 BLAS を複数の変換で TLAS に参照させればインスタンス化になる、の三点。加えて「RTコアが担うのはトラバーサルと交差判定で、陰影計算はシェーダコアが担う」「実務は全画面 RT ではなく可視面ラスタライズ+反射/影/GI の RT というハイブリッド」を押さえると強い。
まとめ
- RTコア は BVH トラバーサルと三角形・AABB 交差を専用回路で高速化し、分岐発散に弱いシェーダコアを陰影計算に専念させることでレイトレーシングをリアルタイム域へ引き上げた。
- 加速構造は BLAS(形状の木)/TLAS(インスタンス参照+変換行列) の二段。剛体は BLAS を再利用し、動くのは軽い TLAS だけ。変形は refit で AABB のみ更新する。
- レイトレーシングパイプラインは Ray Generation・Intersection・Any-Hit・Closest-Hit・Miss から成り、
TraceRayを起点に光線のライフサイクルへシェーダをディスパッチする。マテリアル対応は SBT が担う。 - 実務は ラスタライズで可視面、レイトレーシングで影・反射・GI のハイブリッド。少数サンプルのノイズは時間的蓄積とデノイザーで補う。
- API は DXR(TraceRay/Shader Table)と Vulkan RT(traceRayEXT/SBT) が同等で、単発問い合わせ向けの インライン方式(RayQuery) も持つ。
グラフィックス Article
ハードウェアレイトレーシング(RTX・DXR)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
レイトレーシング
比較で見る軸
難易度: advanced / カテゴリ: グラフィックス / タグ数: 6
導入後に効く点
加速構造は二段構成で、形状ごとの木を BLAS(bottom-level)として一度作り、シーン内のインスタンスは TLAS(top-level)に「BLASへの参照+変換行列」として並べるため、剛体が動いても BLAS を再利用できる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- グラフィックス
- タグ数
- 6
判断チェックリスト
- 自社の用途が「レイトレーシング / RTコア」に近いか確認する。
- 強みである「RTコアは加速構造(BVH)の探索と三角形交差判定を専用回路で行い、シェーダコアを陰影計算に専念させることでレイトレーシングをリアルタイム域へ引き上げる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。