Infoseek 楽天

GPUの「レイトレーシング処理」改良の歴史をひもとく【GeForce RTX 30シリーズ編】

ITmedia PC USER 2024年7月12日 17時0分

 「レイトレーシングが変えるゲームグラフィックス」というテーマでつづってきた不定期連載。前回、レイトレーシングの後継技術ともいえる「パストレーシング」の話題を出したところで、ひとまずの完結を迎えたつもりだった。

 それから1年――少し視点を変えて「GPUから見たレイトレーシング」、もう少し具体的にいえば「GPUにおけるリアルタイムレイトレーシング処理の改良の歴史」について、3つの記事に分けてひもといていこうと思う。

 今回はPC向けGPUにおけるリアルタイムレイトレーシングの歴史を大まかにチェックした上で、NVIDIAの「GeForce RTX 30シリーズ」について深掘りしていきたい。

●リアルタイムレイトレーシングの大まかな歴史

 2018年、リアルタイムレイトレーシング技術を世界で初めて搭載したのがNVIDIAの「GeForce RTX 20シリーズ」だ。

 同年、Microsoftはゲーム/マルチメディア向けAPIセット「DirectX 12」に、GPUのリアルタイムレイトレーシング処理機能を使うためのAPI「DirectX Raytracing」を追加した。ただ、本APIが本格的に使われ始めたのは、2020年に「DirectX 12 Ultimate」がリリースされた頃からだ。

 「PlayStation 5」「Xbox Series X|S」といった、リアルタイムレイトレーシング技術対応の家庭用ゲーム機が登場したのも、2020年と時期が重なる。

 2021年頃になると、多くの市販ゲームタイトルが、ゲームグラフイックスにレイトレーシングを積極的に活用し始めた。このムーブメントを後押しした象徴的なタイトルは、Remedy Enterrainmentの「Control」(2019年リリース)と、CD Projekt REDの「Cyberpunk 2077」(2020年リリース)が挙げられるだろう。

 多くのゲームタイトルが、実践的なレイトレーシング対応に乗り出すと、現状のGPUのレイトレーシングバイブラインにおいて、どういった処理系がボトルネックになりやすいのか、ということが見えてくるようになる。

 こうした「気付き」は、ゲーム開発者はもちろん、GPU開発者にもあったはずだ。実際、NVIDIAはもちろんAMDも、第2世代以降のリアルタイムレイトレーシング対応GPUでは「ここをこうすればもっと速くなる」という改良が盛り込まれている。

 ということで、次ページからはGeForce RTX 20シリーズに対する改良版GPU「GeForce RTX 30シリーズ」が、実際にどのような改良を施したのか見ていこう。

●「GeForce RTX 30シリーズ」はどのくらい改良されたのか?

 2018年のGeForce RTX 20シリーズ(開発コード名:Turing)によって、ハードウェアベースのリアルタイムレイトレーシングの“扉”を開いたNVIDIA。その2年後の2020年、同社は新型GPU「GeForce RTX 30シリーズ」(開発コード名:Ampere)を開発した。

 GeForce RTX 20シリーズのトップモデル「NVIDIA TITAN RTX」(GeForce RTX 2080 Tiの上位機で、2019年発売)のプログラマブルシェーダーコアの総数は4608基で、その理論性能値は16.31TFLOPSだった。

 それに対して、GeForce RTX 30シリーズのトップモデル「GeForce RTX 3090 Ti」(2022年発売)は、ログラマブルシェーダーコアは1万752基で、理論性能値は40TFLOPSとなっている。

 ということは、先代比でプログラマブルシェーダーユニットの総数は約2.3倍、理論性能値は約2.5倍となっており、かなりの性能強化が果たされている。

 「なら、レイトレーシング性能も高くなっているのかな?」と考えてしまうのだが、プログラマブルシェーダーユニットの強化ぶりとは裏腹に「それほどでもない」というのが正直なところだ。というのも、ハードウェアレイトレーシング処理を担う「RT(レイトレーシング)コア」の総数がわずか17%増(72基→84基)にとどまっているからだ。

 しかし、GeForce RTX 30シリーズをリリースした当時、NVIDIAは「RTコアの性能は、先代比で2倍に向上した」とアピールしていた。これはどういうことなのだろうか?

●GeForce RTX 30シリーズでレイトレ処理は“どう”改善したのか?

 NVIDIAの主張の“核心”に迫る前に、ちょっとした“前説”を入れよう。

そもそも「レイトレ」って何だっけ?

 この連載も久しぶりなので、レイトレーシングの概念を軽くおさらいしておこう。

 レイトレーシングとは「あるピクセルの色を計算するとき、当該ピクセルが受け取るはずの光の情報を探るために、光線(=レイ)を射出してたどる(=トレーシングする)処理」のことを指す。

 光線の射出方向と角度は、回収したい情報の種類によって決まる。例えば、近くの光源に向かって光線を射出して光源に到達できれば、そのピクセルは「その光源に照らされている」ことが分かる(下図「1」を参照)。一方、光源に達する前に他の3Dオブジェクトと衝突すれば、そのピクセルは「3Dオブジェクトによって影になっている」ことが分かる(下図「2」を参照)。

 さらに、当該ピクセルを見つめるユーザーの目線の反射方向に光線を射出して、他の3Dオブジェクトに衝突したとしたら、そのピクセルには「衝突した3Dオブジェクトが映り込んでいる」と判断できる(下図「3」を参照)。

「RTコアの性能は先代比で2倍」の“からくり”

 RTコアが担当するのは、そんなレイトレーシングにおける「光線の生成処理」と、光線を動かす「トラバース(横断)処理」、そして衝突判定に相当する「インターセクション(交差)判定」の3点だ。

 GeForce RTX 30シリーズ発表当時、NVIDIAは同シリーズのRTコアの公称性能値の目安として、「GeForce RTX 3080(GA102)の三角形との交差判定レートは、GeForce RTX 2080 SUPER(TU102)の2倍」と語っていた。

 先述の通り、GeForce RTX 20シリーズとGeForce RTX 30シリーズのトップモデル同士で比較すると、RTコアの総数は17%しか増えていない。なのに、性能の向上率は1.17倍ではなく2倍――なぜ、そのようなことが可能なのか。

 実は、この“2倍”の意味は簡単に解説できる。結論からいうと、GeForce RTX 30シリーズでは、RTコアにおける交差判定ユニットのデュアルパイプライン化によって、完全並列動作を実現したことが大きな要因だ。順を追って解説しよう。

 近代のレイトレーシング技術では、三角形の交差判定を高効率に行うために、3Dオブジェクトを「BVH(Bounding Volume Hierarchy)」と呼ばれる構造で管理している。

 BVHは、当該3Dモデル全体を覆うことができる最小体積の直方体(Box)だ。なお、この直方体は3D座標軸に平行/垂直な向きにそろえられた「AABB(Axis Aligned Bounding Box)」構造になっている。こうした構造体は「AS(Acceleration Structure)」と呼ばれる。

 さて、話は少し変わるが、GeForce RTX 20シリーズとGeForce RTX 30シリーズのRTコアのブロックダイヤグラムを見比べて見てほしい。

 RTコアでは、「BVH Traversal」という箇所でレイの「生成」と「推進」の処理を行う。推進処理は、事実上はリスト構造への探索のようなものになる。

 そして、BVH Traversalとつながる「Bounding Box Intersection」は、推進したレイとAABBとの衝突判定を行う。そして同じくBVH Traversalとつながる「Triangle Intersection」は最下層のAABBとの衝突した際に呼び出され、三角形との最終的な衝突判定を行う。

 Triangle Intersectionでは、シンプルながらも幾何学的な計算が行われる。図をよく見比べると分かるが、GeForce RTX 30シリーズではTriangle Intersectionが“二重化”されている。先に触れた「交差判定ユニットのデュアルパイプライン化」は、まさにこのことである。

 要するに、2つのパイプラインが“個別に”レイの「三角形との衝突判定」を計算できるので、「性能2倍」とうたっているわけだ。

三角形との衝突判定を“緩めた”ことも重要なポイント

 もう1つ、ブロックダイヤグラムの比較で注目すべきポイントがある。GeForce RTX 30シリーズでは「Interpolate Tri Position(Time)」なるユニットが新設されているのだ。

 ここは一体何をする場所なのかというと、イメージ的には「投げられたレイと三角形の衝突を計算する際に、特例事項を容認/介入させるユニット」になる。ここでいう特例事項は、レイとの「当たり判定」を緩くすることだと考えると分かりやすい。

 衝突対象の三角形に「運動(移動)している属性」が付けられているとき、本ユニットはその三角形の速度パラメーターから逆算して(投射計算して)過去の位置(設定によっては未来の位置)を求める。これにより、Triangle Intersectionにおいて「衝突判定がゆるくなった三角形」との衝突も取れるようになった。

 「なぜこんなことをする必要があるのか?」というと、現実世界とは違い、現在のレイトレーシング処理では、3Dシーン(正確にはBVH構造体)に投げられるレイの数に限りがあり、高速移動体とレイとの衝突判定でミスが生じる可能性があるからだ。

 衝突判定を緩くする“補間ユニット”たるInterpolate Tri Position(time)が存在するおかげで、今まではうまく衝突できていなかった三角形とも衝突が取れるようになるのだ。

 「え、判定を緩めてまで衝突を取って、何がうれしいの?」という疑問もあるかもしれない。そこに対する解説も必要だろう。

 例えば、現在時間のレイに対して「今から1秒前、そこに存在した移動体の三角形」との衝突が取れたとする。現在時間には存在しないのだから、それは「残像」となる。

 残像というのはうっすら見えるモノだ。だったら、その三角形をライティング/シェーディングした上でうっすら描いてやればいい。すると高品質な「モーションブラー」を作りやすくなる――そんなイメージの理解でいいだろう。

 このメカニズムのおかげで、GeForce RTX 20シリーズのRTコアでは衝突が取れていなかったかもしれない移動体の描画品質の向上も期待できる。

 ここまで聞くと「ゲームってよく3Dオブジェクトが動くし、これでレイトレを使ったゲームグラフィックスも加速しそう!」と期待が高まる。しかし、残念ながら今のところはそうなりそうにない。

 というのも、このInterpolate Tri Position(Time)ユニットは、現時点ではDirectX Raytracingから使う手立てがないのだ。「じゃあどうやって使うの?」というところだが、NVIDIAはオフラインレンダリング向けに「NVIDIA OptiX」というレイトレーシングエンジン(フレームワーク)を提供しており、それを介して利用できる。

 OptiXでは移動体として「Motion acceleration structure」を定義できる。Interpolate Tri Position(Time)ユニットは、こうしたオブジェクトに対してのレイトレーシングに有効ということなのだろう。

●「交差判定のデュアル化」には大きな価値あり!

 先述の通り、動きの速い動体への交差判定効率を上げる観点で重要なInterpolate Tri Position(Time)ユニットは、現時点でもDirectX Raytracingから活用する手段はない。そのこともあり、GeForce RTX 30シリーズのこの機能を活用したゲームは極めて少ない(ほぼゼロと言ってもよいかもしれない)。

 ただ、レイの交差判定のデュアルパイプラン化は、ゲーム側のパフォーマンス向上につながる。特別な対応も不要なので、恩恵に預りやすい。これだけでも、GeForce RTX 20シリーズからGeForce RTX 30シリーズ以降に乗り換えるメリットは大きい。

自動的に高速化されることから、同クラス以上のGeForce RTX 30シリーズへ移行する価値はそれなりにあると考える。

 次回は「GeForce RTX 40シリーズ」のRTコアの改良について解説していく。

この記事の関連ニュース