スターウォーズデモ映像が見せるリアルタイムレイトレーシング

#序文
GDC2018でエピックゲームズは一つの映像を見せた。
スターウォーズのことに基づいた映像でびっくりさせるのは既にレンダリングされたことではなく即時に処理されていることだった。

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">TIL don&#39;t mess with Phasma. Epic Games, in collaboration with ILMxLAB and <a href="https://twitter.com/nvidia?ref_src=twsrc%5Etfw">@NVIDIA</a>, today gave the first experimental demonstration of real-time ray tracing in <a href="https://twitter.com/UnrealEngine?ref_src=twsrc%5Etfw">@UnrealEngine</a> at State of Unreal. Watch Reflections, our cinematic piece based on the ray tracing demo. <a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://twitter.com/hashtag/GDC18?src=hash&amp;ref_src=twsrc%5Etfw">#GDC18</a> <a href="https://t.co/gNeEGsb5rU">pic.twitter.com/gNeEGsb5rU</a></p>&mdash; ILMxLAB (@ILMxLAB) <a href="https://twitter.com/ILMxLAB/status/976509197419405312?ref_src=twsrc%5Etfw">March 21, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
上司のストームトルーパーの服の反射効果をみると信じられない。


これにはレイトレーシングという技術が使用された。

<img src="https://qiita-image-store.s3.amazonaws.com/0/295247/4e1b745a-ac0a-07f8-97f0-dde9fd939593.png" width=60%>
薄い被写系深度、地役光源そして難反射効果を見せる再帰的レイトレーシングの例

<img src="https://qiita-image-store.s3.amazonaws.com/0/295247/f0d1da78-2206-8112-cdbc-cc6d221fb0cc.png" width=60%>
レイトレーシングはすごく事実的なイメージを作れる。


レイトレーシングは言葉通り光線の経路を追跡する技術である。光が反射される度に自らがぶつかった物体の色を蓄積することで実際の光の真似をして輝度を失う。
そうすると鮮明な反射と実感なる色感が得られ特定のマテリアルと行くファクトはレイトレーシングだけで得られる。
この技術は最近急に出た技術ではなく概念は50年前に出た。演算量が多すぎるから部分的に利用されてきたのだ。（１プレイムを演算するためには数分から数時間がかかるし1秒には２４プレイムが必要だ。ラープんゼール、アナーと雪の女王みたいなアニメーションのラーニングタイムを考えてみよう）


てもこの映像は「リアルタイムレイトレーシング」によって処理されている。どうしてこれができるのか？

これは最新のGPUの性能とマシンラーニング技術そしていらない時にはレスたらいゼーションを使いやり方で実装されたからだ。
マイクロソフトはDirectX12にてDXR(DirectX レイトレーシング)フレイムワークを開発、
NVIDIAはボルタアーキテクチャGPUから実行されるレイトレーシング技術であるNVIDIA RTXを開発した。
そしてエピックゲームズはこの二つの技術を活用したパイプラインを利用してこの映像を作った。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/295247/817f8fc6-f8c9-7bd7-a532-b47c682b3331.png)

「レイトレーシング」はどんな原理で作動していつ出た技術なのか？


#アルゴリズム

もっとも簡単な形のレイトレーサで説明させて頂く。レイトレーシングのアルゴリズムは下記のようである。

1. 物体間の交差可否を分かるため、ピクセルの真ん中を貫通する光線を発射する。物体を見つかったらそのポイントが光るか影があるか確認するため、影光線を発射する。
2. 小さい球から大きい球に影を置く。影光線は光に当たる前に小さい球と交差する。
3. この光線が高原に向かう経路に何もなかったら交差点は光る。その代わりに他の物体と交差すると影が現れる。
4. この作業をすべてのピクセルに行うと、3次元画面の2次元画面が得られる。

<img src="https://qiita-image-store.s3.amazonaws.com/0/295247/d347afc7-02bb-5fc7-9bbf-0dc68316cf34.png" width=60%>

pseudoコードにかくと下記のようになる。

```c++:
for (int j = 0; j < imageHeight; ++j) {
    for (int i = 0; i < imageWidth; ++i) {
        //光線の方向を確認
         
        Ray primRay;
        computePrimRay(i, j, &primRay);
        //画面に光線を発射して交差する部分があるか確認
        Point pHit;
        Normal nHit;
        float minDist = INFINITY;
        Object object = NULL;
        for (int k = 0; k < objects.size(); ++k) {
            if (Intersect(objects[k], primRay, &pHit, &nHit)) {
                float distance = Distance(eyePosition, pHit);
                if (distance < minDistance) {
                    object = objects[k];
                    minDistance = distance; //目から一番近く交差する物体を探す
                }
            }
        }
        if (object != NULL) {
            //影光線を発射して光るか影が現れるか確認
            Ray shadowRay;
            shadowRay.direction = lightPosition - pHit;
            bool isShadow = false;
            for (int k = 0; k < objects.size(); ++k) {
                if (Intersect(objects[k], shadowRay)) {
                    isInShadow = true;
                    break;
                }
            }
        }
        if (!isInShadow)
            pixels[i][j] = object->color * light.brightness;
        else
            pixels[i][j] = 0;
    }
}
```


上記で説明した通り光を追跡する作業はすべてのピクセルに対して行う。解像度が高くほど、反射される物体が多いほど演算量は多くなる。


#歴史
光に関する研究はかなりずいぶん前から行われてきた。

シチリアのエンペドクレスは、すべてのものは火、空気、土、水4元素になっていると主張しており、私たちの目から光が出て物体に到達したことで物体を見れると主張した。(レイトレーシングは、目から光線を発射して物体に当たらせて光源に至るまで反射させる原理を使用する!)

プラトンとユークリッドによってこの理論は整理されていったが、ルクレティウスというローマ人は新しい理論を提示した。
> 「太陽の光と熱は押された方向に空気の間の空間を通じて即座に発射される微細な原子でできている」
-事物の本性について(De rerum natura)

その後に、似たような理論が出たが、ルクレティウスの見方は広く受け入れられておらず、光は目から放出されるということで理論化されていた。

(天動説を主張した)プトレマイオスは著書「光学(optics)」で屈折、反射、色を含めた光の特性に関して説明したが、光は目から放出されるという観点を捨てなかった。

そのアルキンディというアラブの学者が

>「世の中にあるすべてのものは、(中略)すべての方向に光を放出してきた世の中を満たす」
-星の光線(De radiis stellarum)

を主張し、後を継いで、イブン・アルハイサムというアラブの学者が「光学の書(Kitab al-Manazir)」で

光は光源に関係なく、太陽の光であれ、光であれ、鏡で反射された光であれ全て同一だと言った。 そして光を見るのは物体から反射されたのが目に入っているということだと言った。

初めて正確な定義を出した人が現れたのだ。


コンピューターグラフィックスの歴史で意味のある足跡は、次のようだ。

1968年に「Some techniques for shading machine renderings of solids」という論文でレイトレーシング手法の基礎が紹介された。

先に

1. 頂点の座標の範囲を求めて
2. 範囲内でドローイング対象の点のリストを生成して
3. 特定地点を貫通する平面を確認
4. 光源から出たことが他の図形や表面によって遮られか確認する

ここに意味ある結果のためにはワイオフレームドローイングを計算する時間の数千倍はかかるかもしれないという補足がある。



1979年「An Improved Illumination Model for Shaded Display」の著者のターナーフィティドゥはより発展されたモデルを提示した。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/295247/11340dc6-33cc-758b-e900-0a80eed83a34.png)

光の反射がV、R、P方向になっているならば次のような式が成立すると見た。

**光の光度 = 背景反射 + 難反射光定数　* 光源の方向ベクトル + 全反射光定数 * R方向からの光の光度 + 光の伝播係数 * P方向からの光の光度**

物体と物体間に反射された光を演算するため、再帰演算が必要であり、相当な演算量が求められると見ている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/295247/0236f343-1aac-e7f4-1140-0efc4face23e.png)
「An Improved Illumination Model for Shaded Display」Fig.7
PDP-11/45とVAX-11/780環境で実装されたレイトレーシング


<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">1979年「An Improved Illumination Model for Shaded Display」論文を作成したTurner Whittedのレイトレーシング試演映像<a href="https://t.co/ylZ2cYXY7J">https://t.co/ylZ2cYXY7J</a></p>&mdash; moreflow (@wurami) <a href="https://twitter.com/wurami/status/1044781872507641856?ref_src=twsrc%5Etfw">September 26, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
1979年SIGGRAPHで公開されたターナーフィティドゥのレイトレーシング試演映像


1986年にはjim kajiyaが「The Rendering Equation」でレンダリング方程式を紹介した。

**光の光度 = 幾何学的な抗 * (放出された光の光度 + 積分方程式(散乱され反射された光の光度 * その以前の光の光度))**

上記の公式が出てくるが、これを完全にあるいは近接して実装できるなら、本物のフォトリアリズムの実装ができることになる。
そしてpath tracing、photon mappingのようなモンテ・カルロ方式を利用した方法が現れることになった。




簡単に言えば

**光度 = 直接的に表面から反射された光 + 間接的に色んな環境から反射された光**

として成立されることになったのだ。



#終わりに
上のスターウォーズ映像はボルタGPUを4個装着したDGX Station(個人用スーパーコンピューター。約69,000ドル)で実行された。現在としてはリアルタイム・レートレーシングを活用するためには、あんなレベルの環境を構築しなければならないか、時間が経てば経つほどハードウェアは発展しそれに対する費用も減るだろう。

レイ・トレーシング技術は、ここ数年間、映画および建築視覚化分野に使用されてきており、事実的なイメージの生成の標準になった。以前にはこのようなイメージを何枚かレンダリングするために数時間、数日必要だったが、今はこれをリアルタイムでレンダリングすることが可能になったのだ。

1979年「An Improved Illumination Model for Shaded Display」論文を作成したターナーフィティドゥがNVIDIAに一つのポストを作成した。彼は、リアルタイム・レートレーシングが可能になったという事実に次のような感想を残した。

>（中略）
他の研究者たちが、加速化手法で代役を務め、実用的ではなかったアルゴリズムを実用的なものに転換してくれました。
そのときには、さらなる発展があり、イメージ品質は、球体とチェッカーボードの時代より大幅に進化していました。
このような進化を支えたのは、ムーアの法則の発展と並行処理の実用化でした。コンピューター グラフィックスのリップ バン ウィンクルのように、私はおよそ 40 年後に再び目を覚まし、リアルタイムのレイ トレーシングが当たり前のことになっているのを目撃したのです。一体、どうしたのだろう? 何人かのとても賢い人々がそのために懸命に努力をしたのはわかりました。


#参照
- Some techniques for shading machine renderings of solids, Arthur Appel, 1968
- An Improved Illumination Model for Shaded Display, Tuner Whitted, 1979
- The Rendering Equation, James T. Kajiya, 1986 
- https://www.unrealengine.com/ja/blog/technology-sneak-peek-real-time-ray-tracing-with-unreal-engine
- https://blogs.nvidia.com/blog/2018/08/01/ray-tracing-global-illumination-turner-whitted/
- https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing