Turingのレイトレース手法

Turing GPUの売りはレイトレースを高速で実行するRTコアを搭載したことである。これまでのGPUでの描画では、ガラスや車の塗装などへの景色の映り込みを描画することはできず、画像の迫真性という点では今一つであった。

光源から出た光線が反射を繰り返して、最終的に観測者の目に入射する過程を逐一計算して、それぞれの方向から入射する光の明るさを求めるレイトレース(Ray Trace)という手法があり、迫真性の高い画像を作れるが、計算量が膨大でCG映画などでは1画面の描画に数時間も掛けて画像を作成していた。

レイトレースをリアルタイムに行うことはグラフィックスにとってはHoly Grail(聖杯)で、それをある程度可能にしたTuring GPUは、NVIDIAが画期的なGPUであると喧伝するのは理解できる。

SMの図の各ブロックが実物チップの面積比に近く描かれているとすれば、一番下にあるRTコアはかなり大きな面積を占めていることになる。

  • Hot Chips 31

    Turing GPUはRTコアというレイトレーシング用のアクセラレータを開発して、Pascalでレイトレーシング性能を行う場合と比較して、7倍に高速化した。左のSMの図の各部の面積が実チップの面積にほぼ比例するとみると、RTコアはかなりの面積を占めている

3Dグラフィックスでは張りぼてで形状モデルを作り、三角パネルで張りぼてを覆う。そして、三角パネルへの入射光から反射光を計算する。通常の3Dグラフィックスでは観測者の目に入る反射光しか考慮しないが、レイトレーシングでは、反射光が次の入射光になり、さらに反射光をつくるという多重の反射も計算する。このため、滑らかな塗装に周囲の景色が映り込むということが表現できる。

しかし、多重反射を考慮すると計算対象となる反射の回数が増える。とくに白紙のような面からの反射の場合は色々な角度に光を反射するので、追跡する光線の数が大幅に増えてしまう。なお、反射ごとに光線は弱くなっていく。そして、ある程度以下の明るさになるとトレースを打ち切るので、光線の本数は無限に増えていくわけではない。

また、ガラスや水などの透明な物質に当たった場合は、反射だけでなく、回折して内部に入る光線も出てくる。これらも逐一計算する。

原理的には光は光源から出て、反射や回折を繰り返して、観測者の目に入れば見えるのであるが、光源から順に計算して行くと、目に入らない光線が大部分で、無駄な計算が多くなってしまう。このため、通常は、逆方向に目からスタートして光源にたどり着く(逆方向の)光線を計算する。

次の図で、目から水に向かう光線が1で、2Aが水からの反射、2Bが回折で水の中に入る光、3が壁で反射して光源に届く光である。そして、4は壁で反射して太陽に届く光、5は壁で反射して反対側の壁に届く光、6は左の壁で反射して光源に達する光、7は5の光線が左の壁で反射して太陽に届く光である。

  • Hot Chips 31

    無駄な計算を省くため、光線の経路を逆転して、最終的に目に入る光線だけを計算する。レイトレースでは多重反射のケースも計算するので、映り込みも表現することができる。しかし、計算量が多いのでCG映画をサーバ用CPUで描画すると1フレームの描画に何時間も掛かるという状況であった

レイトレースでは光線がどの三角パネルのどこにぶつかって反射や回折するかを見つける必要がある。しかし、三角パネルは何万とあるので、全部を端からトライして行くのは効率が悪い。これに対しては、BVH(Bounding Volume Hierarchy)という手法が用いられている。

BVHは空間をボックスに分割して、最初は大きいボックス単位で光線がそのボックスを通過するかどうかをテストする。通過していれば、ボックスを細分化したサブボックスを調べて、どのサブボックスを通過するかを見つける。これを繰り返せば、光線と交差する三角パネルがどれであるかを見つけることができる。この方法であれば、交点計算を行う対象を減らして、効率よく交点を求めることができる。

この階層的なサーチのためのBVHを作るのはCPU側で実行されるTuringドライバが行っており、RTコアはBVHを辿りながら最終的にそれぞれの光線が当たる三角パネルと交点の座標を見つけるという作業分担でレイトレースを行っていると考えられる。

  • Hot Chips 31

    光線と三角パネルの交点を見つけるためには、空間をボックスに分割し、光線がボックスを通過するかをテストし、通過する場合はボックスを細分化し、細分化したどのサブボックスを通過するかを見つける。そして、最終的には光線と三角パネルの交点を求める

そして、レイトレースを行うには入射の状況を探るためのプローブレイを発生し、そのレイがどこに当たるかをRTコアで計算する。プローブレイは本数が多く、反射で追加されたりするので、膨大な光線と三角パネルの交点を計算することが必要となる。

光の反射点が求められると、光の入射、反射角、三角パネルの反射特性(反射率、色、質感)などから、反射される光を計算する。これはGPUのシェーダーの仕事である。

スクリーン上の明るさを求めるには、サンプリングやデノイジングなどの処理を行って画像の品質を高める。これもシェーダーの仕事である。

  • Hot Chips 31

    Turingでは光線との交点計算はRTコアが行う