Ray marching is a technique used in computer graphics to render a 3D scene by casting "rays" from the viewpoint and tracing them by moving points step by step. This method is popular for rendering complex scenes with relatively simple shader code. It is also a great tool for understanding and experimenting with various concepts behind 3D rendering, as shown in the pages on Illuminating objects. You can find numerous more examples of ray marching on websites like Shadertoy.

レイマーチングは、視点からのレイ(半直線、光線)に沿って点を逐次的に移動することで、3Dシーンをレンダリングするコンピュータグラフィックスの技術です。この手法は複雑なシーンを比較的シンプルなシェーダーのコードでレンダリングするためによく用いられます。また、「物体を照らす」ページ のように、3Dレンダリングの背後にある様々な概念の理解や実験のための優れたツールでもあります。Shadertoyなどのウェブサイトには、レイマーチングの例が数多くあります。

<aside> 💡 To learn about shaders, please read The Book of Shaders. シェーダーについては、The Book of Shadersを読んでください。

</aside>

<aside> 💡 英語のRayには光を含む放射エネルギーの線や数学における反直線などの意味があります。日本語では「レイ」と書くことにします。レイマーチングについて考える時は、ある一点から何かを真っ直ぐに飛ばすイメージで捉えると良いでしょう。

</aside>

What is ray marching?

レイマーチングとは

We perceive objects by capturing the light that is reflected or refracted by them with our eyes. This means that if we can track the path of light, we should be able to simulate what we see. However, the light that reaches our eyes is only a small fraction of the surroundings. Simulating the light that fills the entire scene is not only unnecessary but also computationally impossible.

人は物体によって反射や屈折された目で光を捉えて、それらを知覚します。ということは、光の経路を追跡できれば、私たちが見ているものをシミュレートすることができるはずです。ところが、周囲の光のうち私たちの目に届くのは、ほんの一部です。シーン全体に溢れる光をシミュレートすることは、無駄なだけでなく、計算的にも不可能です。

Ray marching solves this problem by reversing the direction. Instead of tracing all photons, we shoot rays from a viewpoint, such as an eye or camera. We check if the ray intersects with an object. If it does, we examine the point to determine the color we see in that direction. For instance, we can analyze the direction of light sources from the point to understand how the object's surface is illuminated. We can also shoot more rays towards the light sources to check if the light is blocked by other objects, allowing us to draw shadows.

レイマーチングは、この問題を逆向きに考えることで解決します。すべての光子を追跡する代わりに、視点(目やカメラなど)からレイを飛ばして物体と交差するかどうかチェックします。交差するならその点を調べて、その向きに何色が見えるかを決めます。例えば、その点から見た光源の方向を調べると、物体の表面がどのように照らされているかが分かります。また、光源に向かってさらにレイを飛ばして、他の物体によって光が遮られているかどうかを調べることで、影を描くこともできます。

The method is called ray "marching" because we move points forward step by step along these rays until they hit the objects or go too far without hitting any. This trick can significantly simplify the algorithm because we don’t have to figure out different ways of detecting intersections for different shapes.

この手法がレイ「マーチング(marching - 行進)」と呼ばれるのは、点をレイに沿って一歩一歩、オブジェクトに当たるか、当たらずに遠くに行きすぎるまで進めるからです。このやり方だと、形状ごとに異なる交差点検出の方法を考える必要がないので、アルゴリズムをとても簡単になります。

SDF (Signed distance functions)

Before shooting rays, we need to understand how to define the shapes of the objects we want to draw. We will use functions called SDF (signed distance functions) for this purpose. SDF functions take a point in space as input and return the distance to the closest point on the surface of the object. It is called “signed” because the function returns a positive value if the point is outside the shape and a negative value if the point is inside the shape. We have already seen a few examples here.

レイを飛ばす前に、まず描画する物体の形を定義する方法を理解しましょう。これには、SDF(signed distance function - 符号付き距離関数)と呼ばれる関数を使用します。SDF関数は、空間内の点を入力として受け取り、物体の表面上の最も近い点までの距離を返します。この関数が「符号付き」と呼ばれるのは、点が形状の外部にある場合は正の値を返し、点が形状の内部にある場合は負の値を返すからです。いくつかの例は既にこのページで紹介しました。