ラスタライズ — 三角形を画素で塗る

3Dモデルは最終的にすべて三角形になり、画面は画素の格子でできています。「この三角形はどの画素を塗るのか」を毎秒何十億回も答えるのがラスタライズ。その心臓部であるエッジ関数と重心座標という2つの道具を、画素が塗られていく様子ごと観察します。

1. 走査 — 画素の中心が三角形に入っているか

ラスタライズの判定基準は驚くほどシンプルです。画素の中心点が三角形の内側にあれば塗る。なければ塗らない。画面全部を調べる必要はなく、三角形を囲む最小の長方形(バウンディングボックス)の中だけを走査すれば十分です。

走査アニメ — 中心が内側なら塗る
橙の点線=バウンディングボックス、白い枠=いま判定中の画素。中心の点が水色の三角形の内側なら青く塗られ、外れなら暗いまま。境界ぎりぎりの画素も「中心が入っているか」だけで白黒つけます。
POINT — 判定点は画素の中心1点 三角形が画素面積の何%を覆っているかは見ない。基準を1点に固定するからこそ、辺を共有する隣の三角形との間に隙間も二重塗りも生じない(境界線ちょうどの同点だけは §2 のタイブレークで決める)。

2. エッジ関数 — 内外判定は掛け算2回と引き算

では「中心が内側か」をどう高速に判定するか。辺 v0→v1 に対して点 P が左右どちら側にあるかは、2Dの外積にあたるエッジ関数の符号で分かります。3辺すべてで「内側」の符号がそろえば三角形の中 — つまり三角形とは3つの半平面の共通部分です。

E01(P) = (x1 − x0)(yP − y0) − (y1 − y0)(xP − x0) 右隣の画素 (x+1, y) では E から (y1−y0) を引くだけで更新できる — 走査は画素あたり加算1回(インクリメンタル評価)
3つの半平面の交差 = 三角形(頂点 v1 を動かす)
各辺を延長した直線(赤・緑・青)が平面を2つに割り、エッジ関数が内側符号になる側にその色の薄いフィルタがかかる。3枚のフィルタが全部重なった明るい琥珀色の領域だけが三角形の内部。v1 を大きく動かして巻き順(頂点を回る向き)が逆転すると、内側の符号の基準ごと反転します — GPUはこの符号で表裏(カリング)も判定しています。
注意 — 辺の真上の画素はどちらのもの? 中心がちょうど辺に乗った画素(E = 0)は、その辺を共有する2つの三角形の両方が「自分のもの」と主張してしまう。GPUは「上辺と左辺に乗った画素だけ自分が塗る」というトップレフトルールで機械的に決着させ、二重描画と穴あきの両方を防いでいる。

3. 重心座標 — 3頂点の混合比で塗る

エッジ関数は大事な副産物をくれます。3つのエッジ関数をその合計(=三角形の2倍の面積)で割ると、点 P が「3頂点をどんな比率で混ぜた位置か」を表す重心座標 (w0, w1, w2) になります。頂点に与えた色・深度・テクスチャ座標は、この比率で混ぜるだけで三角形全面になめらかに補間できます。

w0 + w1 + w2 = 1,   色(P) = w0C0 + w1C1 + w2C2 wi = Ei / (E0 + E1 + E2)。色に限らず深度も UV も法線も同じ式で補間される
重心座標による色補間(頂点 C2 を動かす)
頂点に赤・緑・青を割り当てると、内部は重心座標で混ざったグラデーションになる。白い点 P から各頂点へ伸びる線の濃さが w の大きさ。P が三角形の外に出ると w に負の値が現れる — 実はこれが §2 の内外判定そのもの(3つとも ≥ 0 ⇔ 内側)。
POINT — 判定と補間は同じ計算の表と裏 エッジ関数を求めた時点で、重心座標は割り算1回でほぼタダで手に入る。内外判定のついでに全属性の補間器がもらえる — GPUがこの方式を採用し続ける最大の理由。

4. 解像度とジャギー

中心1点の YES / NO で塗る以上、三角形の境界は必ず階段状になります。これがジャギー。解像度を上げると階段は細かくなりますが、原理的には消えません。連続な図形を離散的な点でサンプリングしていることが原因で、音声で学ぶエイリアシングの空間版です。

解像度とサンプリング点 — ジャギーの正体
低解像度では、中心点が入るかどうかのわずかな差で1画素まるごと色が変わるのが見える。MSAA は1画素の中に判定点を複数置き、入った割合で色を混ぜることで境界だけをなめらかにする(点の位置は規則格子を少し回した配置が使われる)。

5. まとめ

一歩先へ — 実物のGPUラスタライザ 実際のハードウェアは1画素ずつ順に調べたりしない。まずタイル単位で「三角形がかすりもしない領域」を一括で捨て(階層的ラスタライズ)、残った画素を 2×2 のクワッド単位で並列判定する。最小単位がクワッドなのは、隣接画素との差分からテクスチャの縮小率(ミップレベル)を求めるため。塗る画素が決まったら、次は重なった三角形同士の前後関係 — 次のレッスン「Zバッファ」へ。