スペクトル Ray Tracing 技術の導入
(larswander.com)- スペクトル ray tracing は、RGB値だけを運ぶ光線の代わりに波長と位相まで扱い、ピクセルごとの スペクトルパワー分布(SPD) を生成する方式
- 一般的な ray tracing は性能のため、カメラから光源方向へ逆追跡し、光線を RGB ベクトル を持つ粒子のように単純化する
- 人間の目は短・中・長波長に敏感な3種類の錐体細胞の反応で色を作り、同じ色でも異なる SPD から生じうる
- 分散 や薄膜干渉のように波長が光の経路と色に影響するシーンでは、RGB 近似だけでは不十分になりうる
- JavaScript と GLSL で作られた依存関係のないスペクトル ray tracer は、光の法則を意図的に変えたコンピュータアートで非現実的な色と動きを生み出す道具として使われる
コードで作るカメラと ray tracing
- コンピュータアートではシーンとカメラの両方をコードで作り、レンダリング結果を RGB 値配列 に変換する
- ray tracing は仮想オブジェクト間で光線を反射させながら、シミュレートされたカメラと光源の間を通る光の経路をモデル化する
- 性能上の理由から、実際の光の移動をそのまま追跡せず、いくつかの単純化を用いる
- ほとんどの光源光線はカメラに到達しないため、光源から出発せず カメラ視点から逆方向 に追跡する
- この逆方向追跡は、光の伝達法則が時間方向に対して対称であるという T-symmetry の仮定の下で物理的に妥当である
- さらに大きな単純化は、光線を波ではなく RGB 色ベクトル を持つ粒子のように扱う方法である
- 光の波動性を無視するが、多くのシーンで物理的にもっともらしい結果を出す
- 人間の目に短・中・長波長に敏感な3種類の色検知細胞があることが、この近似を可能にしている
目は RGB ではなくスペクトルに反応する
- 現実の光は通常、単一波長ではなく複数の波長が混ざった スペクトルパワー分布(SPD) で構成される
- 人が見る1つの色には無数の SPD が対応し、この現象は metamerism と呼ばれる
- 例えば黄色は、およそ 580nm 付近の単一波長でも見える
- コンピュータモニタのように RGB だけを使う装置では、赤色と緑色の光の組み合わせでも黄色を再現する
- マゼンタのように単一波長では作れない 非スペクトル色 もある
- マゼンタはスペクトル上の単一位置には存在しない
- 低波長と高波長、つまり青色と赤色の光の組み合わせが必要になる
- SPD を色に変換する過程は数学的に処理できる
- 物理、生理学、主観的な色経験をつなぐ定量的な対応関係が存在する
- この対応関係は 1931 年に作られた CIE 1931 color spaces にまとめられている
- 直接実装するなら Physically Based Rendering の色に関する章 を参照できる
波長が結果を変えるシーン
- ray tracing で常に全スペクトルや個々の光線の 波長 を考慮する必要があるわけではない
- ただし一部のシーンでは、光の波動的性質が経路に直接影響し、結果として見える色も変わる
- 代表例は 分散 である
- 光の進行経路が波長によって異なる形で曲がる
- プリズムが白色光を構成周波数に分ける現象がこれに当たる
- もう1つの例は 薄膜干渉(thin film interference) である
- シャボン玉に見られる虹のようなパターンを説明する
- 石けん膜境界の上層と下層で反射した光が強め合い・打ち消し合いの干渉を起こす
- この過程はスペクトルを単一波長に分離するというより、スペクトルの一部の寄与を強めたり弱めたりする
- その結果、青緑、ティール、マゼンタ、茶色のような非スペクトル色がしばしば生じる
スペクトル ray tracing が扱うもの
- スペクトル ray tracing は、光の 波動的性質 を考慮する ray tracing である
- RGB 色だけで世界を計算するのではなく、シーンの各ピクセルについて スペクトルパワー分布 を生成する
- 光線の波長と位相をあわせて用い、この情報が重要な状況で色をより適切に推定する
- 分散や薄膜干渉のように、波長と位相が結果の色を変える場合に特に有用である
コンピュータアートでの活用
- 最近の制作では、光の動く法則を意図的に破り、現実とは少し異なる宇宙のカメラをコードで作る方法が使われている
- 光の全スペクトルの豊かさを扱いながら、光伝達のルールを非現実的な形に変えることができる
- 公開されている出力物は、手書きの 依存関係のない JavaScript および GLSL スペクトル ray tracer で生成されている
- 例として次の作品が含まれる
- Light Doesn't Bend That Way #1, 2023
- 反射角を波長の関数にして生成されている
- この過程はスペクトル色だけを生成しているように見える
- Untitled, 2023
- FULL_SPECTRUM シリーズのための制作中作品で、2023 年に東京で公開された
- Untitled, 2023
- Video 3 として提供されている
- このシステムで作品を動かす過程が特に重要に扱われている
- Untitled, 2024
- Light Doesn't Bend That Way #1, 2023
1件のコメント
Hacker News のコメント
自分で作ってみたいなら、無料電子書籍 Ray Tracing Gems II 1 が 最新 API とハードウェアアクセラレーションに基づくリアルタイム GPU レイトレーシングを扱っており、スペクトラルレンダリングの章もある
特に第42章 “Efficient spectral rendering on the GPU for predictive rendering” が該当する
1 https://www.realtimerendering.com/raytracinggems/rtg2/
ごく短時間で入門するなら Ray Tracing in One Weekend 1 もおすすめで、その後さらに深掘りしたいなら Physically Based Rendering [2] がよい
1 https://raytracing.github.io/
[2] https://pbrt.org/
レイトレーシングを自分で触る時間はないが、本の前半をざっと見たところ、エイリアスサンプリング(alias sampling) は非常にエレガントで優れた手法だった
グラフィックスよりはるかに広い文脈で役立つので、もっと早く知っていればよかったと思う
スペクトラルレイトレーサーの例はいくつかある
Mitsuba は微分可能レンダリングのような優れた機能を多く備えた、オープンソースの研究用レンダラー https://www.mitsuba-renderer.org/
Maxwell には精度の異なる2種類のスペクトラルモードがあり、より複雑な方式は光学分野でよく使われる https://maxwellrender.com/
Wētā FX の Manuka はスペクトラルレンダラーで、複数の長編映画で使われている https://dl.acm.org/doi/10.1145/3182161 および https://www.wetafx.co.nz/research-and-tech/technology/manuka
内部構造を見たいが、大規模プロダクション向けは複雑すぎるという場合は、この実装をのぞいてみるのがおすすめ
スペクトラルパストレーサーの最小構成に近い、優れた例 https://github.com/TomCrypto/Lambda
Indigo Renderer とオープンソースの LuxRender もある
https://indigorenderer.com
https://luxcorerender.org
私の考えでは、スペクトラルレンダリングは レイトレーシング自体がレンダリングの終着点ではなく、むしろ出発点に近いことを示す良い例だ
時々、リアルタイムレイトレーシングでレンダリングの問題は解決したかのような雰囲気を見るが、実際とはかなりかけ離れていると思う
ほとんどのスペクトラルレンダリングシステムは、薄膜干渉や他の波動ベースの効果を扱っていないと理解しているので、そちらもまた別のフロンティアだ
現実には驚くほど多くのディテールがある
レンダリングが基礎にある物理原理へ近づくほど、ゲームエンジンはますます世界シミュレーションエンジンになっていくはず
今日では一般に分かれている複数のエンジン構成要素が共通の地点へ収束し、たとえば物理レイヤーとレンダリングレイヤーの区別が小さくなる可能性がある
こうした流れが今でもある程度観察されているのか気になる
計算性能がさらに数桁大きくなれば、現在の抽象化も、30年前の最先端技術を見るように、過去の技術的制約が生んだ形に見えるだろう
フラクタルのようで、近づいて見るほど、私たちが見ているものに影響する細部がさらに多く現れる
100% 物理的に正確なレンダリングへ少しずつ近づいているが、おそらく 100% には到達せず、小さな割合を足し続けていくのだと思う
現実には驚くほど多くのディテールがある、という話に加えると、実装しているところは少ないが、特定のシーンではかなり目立つ効果を生むものとして光の偏光1もある
優れたスペクトラルレイトレーシングエンジンとして LuxRender がある: https://luxcorerender.org/
ただし、これは旧バージョン基準で、最新の LuxCore レンダラーには完全なスペクトラル対応はない
ここに挙がっている効果以外にも、スペクトラルレンダリングにはさらに利点がある
光追跡方式で実装すれば、後から光源の色、スペクトル、強度を変えられ、多くのシーンで間接照明もはるかに正確になる
レイトレーシングの実装で遊んでみたいなら、自分で書くのは意外と簡単です
良い無料の本(https://raytracing.github.io/books/RayTracingInOneWeekend.ht...)があり、Unityを少し知っているならGPUベースのチュートリアル(https://medium.com/@jcowles/gpu-ray-tracing-in-one-weekend-3...)も良いです
Unity版にはシーンのプレビューやカメラ移動を簡単にしてくれるGUIがあり、触りやすいです
ゼロから書きたくないなら、こうした資料を基にした実装も多くありますが、自分で試してみる価値は間違いなくあります
基本実装で遊びながら、光線を粒子のように動かして物体の方へ、またはその反対へ経路を曲げたり、最後の反射角を覚えて次の材質との衝突に使わせたりしてみました
ほとんどの結果はいまひとつでしたが、見ている対象への直感は得られましたし、カメラを少し動かしてみるのも大いに役立ちます
小さな趣味のプログラミングプロジェクトとして本当に楽しいです
ただし、物体と交差したら光線の最大長を小さく設定し、その地点から周囲へ複数の光線を飛ばして、各衝突に重力方程式に似たものを適用する、というやり方です
もちろん遅く、あくまで近似ですが簡単で、シーン内の光を曲げるブラックホールオブジェクトのようなものも実装できます
初めてレイトレーサを書いたときは週末いっぱいはかからず、一晩で書いたCコード4ページ程度でした
http://canonical.org/~kragen/sw/aspmisc/my-very-first-raytra...
その後、ClojureとLuaでレイトレーサを、JavaScriptでレイマーチャ(ray marcher)を作りましたが、とても小さく単純にできます
昨夜はmentor/TBCのSpongy https://www.pouet.net/prod.php?which=53871を見たのですが、霧のあるフラクタルアニメーションのレイトレーサが機械語命令65個でできており、MS-DOS実行ファイルは128バイトです
レイトレーシング画像は非常に格好いいので、それを作るアルゴリズムやデータ構造もとても難しいはずだと圧倒されがちですが、3次元ベクトルをすでに知っているなら実際にはかなり単純です
SDFレイマーチングは、従来のWhitted方式のレイトレーサよりもさらに単純だと感じます。シーン形状との正確な交差を解くための複雑な数学の大半を、非常に単純な逐次近似アルゴリズムに置き換えるからです
SpongyやOscar Toledo G.のbootsector raytracer https://github.com/nanochess/RayTracerのような極端に小さいレイトレーサは、少し大きめの実装よりもかえって理解しにくいことが多いです
そこまで小さくするには多くのトリックが必要で、そのトリックは単純なコードより理解しにくいからです
突き詰めるなら、各光線の波長だけでなく、偏光と位相も追跡する必要があります
こうした性質が実際に人間の知覚に影響するケースは、薄膜や回折格子のようにまれですが、確かに存在します
数学と物理学が実際に機能する美しさが見えます
美しさのために入れた一部の調整が、ほかの可視化方法にも役立つのか気になります
Apple IIで多声の音楽を作ろうとして、本のコードを写し打ちしていたころも思い出します
実行してみると明らかに何かが間違っていたのですが、荒いノイズではなく、不思議に美しい音のパターンが出てきて、その偶然のミスがかなり魅力的でした
ハイパースペクトル画像のように、3チャンネルをはるかに超える画像を作れるのではないかと思います
子どもに色をよりよく教えるため、スペクトルを強調する用途で調べたことがあります
たとえば画像1上でピクセルにマウスを重ねるとスペクトルを表示し、色とスペクトルの結びつきを強めるという方法です
しかしハイパースペクトル画像はまれで、従来はカメラ[2]が高価でした
では合成ハイパースペクトル画像はどうでしょうか?
非常に低解像度のブラウザレンダラーなら、照明と材質をインタラクティブにいじって遊べるくらい速いかもしれません
さらに色覚異常、「白内障の水晶体除去後にUVを見られる」人間、2色型の非霊長類哺乳類(ネズミ/犬)、4色型のゼブラフィッシュの視点も実装してみられそうです
1 http://www.ok.sc.e.titech.ac.jp/res/MSI/MSIdata31.html
[2] 時分割の狭帯域照明を使う低価格のマルチスペクトルカメラ: https://ubicomplab.cs.washington.edu/publications/hypercam/
画像の最終値は各光源の寄与分を変換した値であり、光源のスペクトルが分かっているので、ピクセルのスペクトルも得られます
ただし意味のある分散や薄膜効果に出会うと、各経路ごとに波長をサンプリングする必要があるため、より近似的な方法になります
自分の分布レイトレーサーに屈折を実装してみようかと考えていた
確率的な方式であって、並列方式ではない https://en.m.wikipedia.org/wiki/Distributed_ray_tracing
周波数をランダムにサンプリングし、その色を計算したうえで、光線の色を調整するのに使えばよさそう
純粋な屈折色が明るさの1/3になるのを補正するには、結果に3を掛ける必要がある
記憶では、Rob Cook の SIGGRAPH 論文の一つで出てきた用語
より一般的で統合された概念としては、経路追跡のほうへ移っていくのがよく、検索したり調べたりするときにもヒントや手法を見つけやすい
スペクトラルレンダリングと屈折を組み合わせるときは、分布をサンプリングして周波数を選ぶ必要がある、という理解で合っている
一般的には難しくなり得るので、段階的に積み上げていくほうがよい
反射も同様だが、どちらの場合も周波数依存のマテリアルを使うかどうかは選択次第
単純化したマテリアルを使うとしても、スペクトラル方式を使う理由はなおある