Path Tracingしてみる | 2003/10/05 (Sun)
Path Tracingしてみる。
実はSqueakでホソボソと作っている3Dグラフィック。
ようやくPath Tracingが「らしく」なってきた。
それで、Path Tracingってなんだろ。
復習してみよう、というコトで、カンタンな説明をココロみる。
「モノが見える」というコトは、光がそのモノに当たって反射し、目に飛び込んでくるというコトだ。
シンプルに考えれば、3Dグラフィックは、これをそのまんま実装すればよいことになる。ところが、これには大きな落とし穴がある。
この広い世界の中で、目に飛び込んでくる光はごくわずかだ。つまり、ムダが多すぎる、計算するにはコストがデカすぎる、ちゅうコトだ。
では、どうすればよいか。
光源からじゃダメなんだったら、目からいく。逆転の発想だ。
目の前にスクリーンがある。
スクリーン上の1点に視線を向ける。さらにその先に視点を辿っていく。
この視線がモノに当たったとする。
今度は、この視線とモノがぶち当たった点と光源を結ぶ直線上に、他のモノがないかを確かめる。
なければ、この点に、光源からの光が届いている(あれば、光が遮られている)。
この点に光が届いているというコトは、この点で反射された光が目に飛び込んできているというコトだ。
光がモノに直接当たって見える、というコトで、これを「直接照明」というんだな。
(ちなみに、光の反射ぐあい、どんな方向にどのくらいの強さで光を反射するかは、物体の性質に依存する。しかし、その話はそれだけでもかなり長くなるんで、また別の機会にすることに。)
ところで、目に見えるモノはそれだけじゃない。
他のモノに当たった光が反射や屈折を繰り返して目に飛び込んでくるコトもある。
これを「間接照明」という。これは、さっきの「視点とモノがぶち当たった点」を視点と見立てて、反射してきた方向に新たな視線を送ることで計算される。これも結果的には目に届く光だ。
このようにして、直接照明と間接照明の両方で、スクリーン上の1点の光の強さが決まる。
Ray Tracingは、対象となる空間の光の伝搬を目から遡っていく。視線(ray)を辿って(trace)いくから、Ray Tracing。
クラシカルなRay Tracingは、スクリーン上の1点につき1本の視線を送り、間接照明について、完全な鏡面反射と屈折を計算する。これらは反射方向(視線を辿る先)がカッチリ決められるので、実装もラクなのだ。
ただし、これは完全鏡面反射と屈折以外の反射を無視してる、というコトでもある。
ところで、数学上の点は面積がないが、スクリーン上の1点、すなわちピクセルは現実には正方形で、面積がある。
Ray Tracingでは、ピクセルのど真ん中に視線を送っていると捉えることができる。いいかえれば、ど真ん中以外の、例えばすみっこ辺りについては、やっぱり無視してるのだ。
だから、影になっている部分は真っ黒だし、そのふちもシャープになる。
Path Tracingは、スクリーン上のピクセルの範囲内でランダムに何本かの視線を送り、結果を平均して光の強さを決める。間接照明については、ランダムな方向を選んで光の経路(path)を限定しない。そういう方法なのだ。
さて、ワタクシのPath Tracing、まだまだやることがある。それは、透過と屈折。
参考書を読みつつ、ここまで何とか辿りついたけど、まだまだ先は長そう。
(というか、ここまでもかなり長かったんだけど。)
まぁ、お気楽に、んで気長にやっていこうと。
では、続く。
実はSqueakでホソボソと作っている3Dグラフィック。
ようやくPath Tracingが「らしく」なってきた。
それで、Path Tracingってなんだろ。
復習してみよう、というコトで、カンタンな説明をココロみる。
「モノが見える」というコトは、光がそのモノに当たって反射し、目に飛び込んでくるというコトだ。
シンプルに考えれば、3Dグラフィックは、これをそのまんま実装すればよいことになる。ところが、これには大きな落とし穴がある。
この広い世界の中で、目に飛び込んでくる光はごくわずかだ。つまり、ムダが多すぎる、計算するにはコストがデカすぎる、ちゅうコトだ。
では、どうすればよいか。
光源からじゃダメなんだったら、目からいく。逆転の発想だ。
目の前にスクリーンがある。
スクリーン上の1点に視線を向ける。さらにその先に視点を辿っていく。
この視線がモノに当たったとする。
今度は、この視線とモノがぶち当たった点と光源を結ぶ直線上に、他のモノがないかを確かめる。
なければ、この点に、光源からの光が届いている(あれば、光が遮られている)。
この点に光が届いているというコトは、この点で反射された光が目に飛び込んできているというコトだ。
光がモノに直接当たって見える、というコトで、これを「直接照明」というんだな。
(ちなみに、光の反射ぐあい、どんな方向にどのくらいの強さで光を反射するかは、物体の性質に依存する。しかし、その話はそれだけでもかなり長くなるんで、また別の機会にすることに。)
ところで、目に見えるモノはそれだけじゃない。
他のモノに当たった光が反射や屈折を繰り返して目に飛び込んでくるコトもある。
これを「間接照明」という。これは、さっきの「視点とモノがぶち当たった点」を視点と見立てて、反射してきた方向に新たな視線を送ることで計算される。これも結果的には目に届く光だ。
このようにして、直接照明と間接照明の両方で、スクリーン上の1点の光の強さが決まる。
Ray Tracingは、対象となる空間の光の伝搬を目から遡っていく。視線(ray)を辿って(trace)いくから、Ray Tracing。
クラシカルなRay Tracingは、スクリーン上の1点につき1本の視線を送り、間接照明について、完全な鏡面反射と屈折を計算する。これらは反射方向(視線を辿る先)がカッチリ決められるので、実装もラクなのだ。
ただし、これは完全鏡面反射と屈折以外の反射を無視してる、というコトでもある。
ところで、数学上の点は面積がないが、スクリーン上の1点、すなわちピクセルは現実には正方形で、面積がある。
Ray Tracingでは、ピクセルのど真ん中に視線を送っていると捉えることができる。いいかえれば、ど真ん中以外の、例えばすみっこ辺りについては、やっぱり無視してるのだ。
だから、影になっている部分は真っ黒だし、そのふちもシャープになる。
Path Tracingは、スクリーン上のピクセルの範囲内でランダムに何本かの視線を送り、結果を平均して光の強さを決める。間接照明については、ランダムな方向を選んで光の経路(path)を限定しない。そういう方法なのだ。
さて、ワタクシのPath Tracing、まだまだやることがある。それは、透過と屈折。
参考書を読みつつ、ここまで何とか辿りついたけど、まだまだ先は長そう。
(というか、ここまでもかなり長かったんだけど。)
まぁ、お気楽に、んで気長にやっていこうと。
では、続く。
