Computer Graphics · Rasterization / Ray Tracing

画像はどう作られるかラスタライズとレイトレーシング

建築のパースも、ゲームの映像も、RhinoのRenderedビューも、 すべては3次元の形を、平面に並んだ画素(ピクセル)の色へ変換することで生まれます。 その変換には、正反対の発想をした2つの流儀があります。 形のほうから画素へ塗っていくラスタライズと、 画素のほうから光の道すじをたどるレイトレーシング。 この教材では、シーンを外から俯瞰する視点に立って、 それぞれの手法が1画素ずつ画像を組み立てていく様子を、解説のすぐ後で手を動かして体験します。

学習を始める ↓
Section 1

共通の舞台 — カメラ・スクリーン・シーン

どちらの手法も、同じ問いに答えようとしている

レンダリング(画像化)が解こうとしている問題は、突きつめると一文です。 「スクリーンの各画素を、何色に塗ればよいか」。 舞台には、シーンを見るカメラ(視点)、 カメラの前に浮かぶスクリーン(画素が格子状に並んだ面)、 映したいオブジェクト、そして光源があります。 このデモでは、その舞台全体を斜め上から俯瞰したメタ視点で見ます。 ふだんは意識しない「カメラの外側」から、画像が作られる過程そのものを観察するためです。

画素をどう塗るかを決めるとき、進む向きは2通りあります。 ひとつはオブジェクトを順番に取り上げ、それが画面のどこに写るかを求めて画素を塗るやり方(ラスタライズ)。 もうひとつは画素を順番に取り上げ、その画素に何が写っているかを光をたどって突き止めるやり方(レイトレーシング)。 前者は「形 → 画素」、後者は「画素 → 形」。まさに逆向きのループです。

次の2つのセクションで、まずラスタライズ、続いてレイトレーシングを、 それぞれ解説の直後に置いたプレイグラウンドで実際に動かして確かめます。 まずは、画面が48 × 36 = 1,728個のあらい画素でできていると思ってください。 この一粒ずつが、これから塗られていきます。

Section 2

ラスタライズ — 形を画素へ「塗る」

オブジェクトの側から画面を攻める、GPUの得意技

ラスタライズ(rasterize=「格子状の点の集まりにする」)は、 オブジェクトを構成する三角形を1枚ずつ取り上げ、それを画面に投影して、覆った画素を塗る手法です。 すべての曲面は、細かな三角形の集まりとして近似されます(球も円錐も、拡大すれば三角形の寄せ集めです)。

ひとつの三角形が処理される流れは、こうです。

  1. 投影 — 三角形の3つの頂点を、カメラの位置から見た遠近法(透視投影)でスクリーン上の座標へ写す。3D空間の点が、画面の2D座標に落ちる。
  2. 被覆判定 — 投影された三角形が、どの画素を覆っているかを調べる。
  3. 陰影と奥行き — 覆った各画素に、光源の向きから計算した明るさで色を置く。ただし手前にすでに別の面が塗られていれば上書きしない(Zバッファによる奥行き比較)。

この手順を全部の三角形について繰り返すと、画像が完成します。 ポイントは、各三角形が「自分の担当画素」だけを触ること。 画面全体を毎回なめる必要がないので非常に速く、 GPU(グラフィックスカード)はこの投影と塗りを何百万三角形も並列にこなすよう作られています。 リアルタイムに動くゲーム、CADのビューポート表示は、ほぼこの方式です。

速さの代償として、ラスタライズは「その画素から世界がどう見えるか」を知りません。 三角形は自分がどこに写るかを計算するだけで、 鏡に映り込む像や、他の物体が落とす影は、投影の手続きの中に自然には現れません。 影・反射・映り込みは、追加の技法(シャドウマップ、環境マップ等)であとから「それらしく」足す必要があります。

下のプレイグラウンドで、ラスタライズを1ステップずつ動かしてみましょう。

▶ 再生で、三角形が1枚ずつスクリーンへ投影され、覆った画素が塗られていきます。 白くハイライトされた三角形がどの画素を覆うか、奥の面が手前に隠される(Zバッファ)様子に注目。 左ドラッグで視点回転・ホイールでズーム、⚙ で解像度や鏡の壁、? で操作ガイドを開けます。

Section 3

レイトレーシング — 画素から光を「たどる」

画素の側から光をさかのぼる、写実の王道

レイトレーシング(ray tracing=「光線を追跡する」)は発想が逆です。 画素を1つずつ取り上げ、カメラからその画素を通る視線(レイ)を1本シーンへ飛ばし、 最初にぶつかった物体を調べて色を決める手法です。 現実の光は光源から出て目に届きますが、その大多数は目に入りません。 そこで目から逆向きにたどることで、無駄なく「その画素に効く光」だけを追えます。

1つの画素が処理される流れは、こうです。

  1. 視線を飛ばす — カメラから画素へ向かうレイを発射し、シーン内の全オブジェクトとの交差を計算して、最も手前の交点を見つける。
  2. 影を調べる — 交点から光源へ向けてシャドウレイを1本飛ばす。途中で何かに遮られていれば、その点は影の中。
  3. 反射をたどる — 面が鏡のようであれば、反射方向へ新しいレイを飛ばし、映り込む先の色を再帰的に求める(バウンス)。設定した反射回数まで繰り返す。
  4. 色を合成 — 直接の陰影・影・反射で得た色を足し合わせ、その画素の最終色にする。

この方式の強みは、影・反射・映り込みが原理から自然に出てくることです。 光の道すじをそのまま追っているので、後付けの小細工が要りません。 代償は計算量で、画素ごとに交差判定を何度も行い、反射のたびにレイが増えます。 映画のCG、RhinoのRaytraced(Cycles)、V-RayやEnscapeなどの写実的レンダラーがこの系譜です。

プレイグラウンドでは、飛んでいくレイが色分けして描かれます。意味は次のとおりです。

  • — カメラからスクリーンの画素へ向かう視線の起点
  • — 画素から飛ばした一次レイ(最初に物体へ当たるまで)
  • — 反射して次の物体へ向かうレイ(バウンス)
  • 黄(破線) — 光源まで遮られず届いたシャドウレイ(=当たっている)
  • 赤(破線) — 途中で遮られたシャドウレイ(=影の中)

下のプレイグラウンドで、レイトレーシングを1画素ずつ動かしてみましょう。

▶ 再生で、画素ごとに青い視線が飛び、当たった物体から黄/赤のシャドウレイ、 鏡面では紫の反射レイが伸びていきます。反射率の高い球(赤)や、⚙ の鏡の壁を置くと反射の連鎖がよく見えます。 左ドラッグで視点回転、⚙ で反射回数、? で色の凡例を開けます。

Section 4

二つの流儀 — どちらが正しいのか

速さのラスタライズ、写実のレイトレーシング

優劣ではなく目的の違いです。ぐりぐり動かす作業画面には速いラスタライズ、 1枚をじっくり仕上げる最終画像には写実のレイトレーシング。 両者の性質を並べておきます。

観点ラスタライズレイトレーシング
進む向き形 → 画素(オブジェクト順)画素 → 形(画像順)
基本操作三角形を投影して塗るレイを飛ばして交差を探す
奥行き処理Zバッファで上書き判定最も手前の交点を選ぶ
影・反射後付け(別技法が必要)原理から自然に出る
速度速い(GPUで並列)重い(画素ごとに追跡)
主な用途ゲーム・CADビューポート写実レンダリング・映画CG

なお現在は両者の融合が進み、GPUのラスタライズを土台にしつつ、 影や反射など「レイトレーシングが得意な部分」だけをレイで補う ハイブリッドレンダリング(リアルタイムレイトレーシング)が主流になりつつあります。 2つの流儀は対立ではなく、組み合わせて使う道具になったのです。

Section 5

考えてみよう

道具の「なぜ」に、原理で答えられるか

Q1. Rhinoで作業中のビュー(Rendered)はサクサクなのに、Raytraced表示に切り替えると急に重くなる。なぜ?

Renderedラスタライズで、各三角形を担当画素へ投影して塗るだけなのでGPUが一瞬で描きます。 Raytracedレイトレーシング(Cycles)で、画素ごとに何本ものレイを飛ばして光をたどるため、 収束するまで時間がかかります。速さと写実性のトレードオフそのものです。

Q2. 鏡に映る像を出したい。ラスタライズだけでは、なぜ素直に出せない?

ラスタライズは三角形が「自分がどこに写るか」を計算するだけで、 その面から世界がどう見えるかは追いません。だから映り込みは原理に含まれず、 環境マップや鏡像カメラといった別技法で近似します。 レイトレーシングなら、面で反射したレイを飛ばすだけで映り込みが自然に出ます (プレイグラウンドで鏡の壁をONにして確かめてください)。

Q3. レイトレーシングは目(カメラ)から光をたどる。現実の光は光源から出るのに、逆向きで正しい答えになるのはなぜ?

光の経路は逆にたどっても物理的に同じ(可逆)だからです。 光源から出る光の大半は目に入らず無駄になりますが、 目から逆にたどれば「その画素に効く光」だけを効率よく追えます。 だから画素→光源の向きで計算します。

Q4. プレイグラウンドで解像度を上げると、レイトレーシングのステップ数が急増するのはなぜ?

レイトレーシングは1画素=1ステップなので、総ステップ数は画素数に比例します。 解像度を縦横2倍にすれば画素は4倍。さらに反射回数を上げれば1画素あたりのレイも増えます。 一方ラスタライズのステップ数は三角形の数で決まり、解像度にはほぼ依存しません — ここにも2つの手法の性格の違いが表れています。