Skip to content
Go back

Rasterizationメモ

· Updated:

ラスタライゼーションについて個人的に調べたものです。内容には間違いが含まれている場合があります。

数学

三角形(Triangles)

  • 3つの頂点vertex、3つのedgeを持つ多角形polygon
  • ある平面上に存在する
    • 退化degenerateしていなければ、その平面が一意に定まる
    • 退化している三角形は、すべての頂点が一直線上にある(共線である)
  • 内側interior外側exteriorがある
    • 内側は有限空間、外側は無限空間
    • 3つの辺から成る境界boundaryで分けられる
  • 常にconvexである
    • 三角形の内側にある2点から成る線分もまた常に三角形の内側にある
    • nn個の辺の凸多角形はnn個の半空間half-spaceとの交差として扱うことができる

向きを持つ辺(Oriented edges)

  • 辺がv0v_0からv1v_1に向かうとき:
    • 左側を”positive”の半空間と呼ぶ
    • 右側を”negative”の半空間と呼ぶ

重心座標系(Barycentric coodinate system)

{λ0(P)=Orient2D(V1,V2,P)/Orient2D(V0,V1,V2),λ1(P)=Orient2D(V2,V0,P)/Orient2D(V0,V1,V2),λ2(P)=Orient2D(V0,V1,P)/Orient2D(V0,V1,V2)\left\{ \begin{aligned} \lambda_0(P) &= \text{Orient2D}(V_1, V_2, P) / |\text{Orient2D}(V_0, V_1, V_2)|, \\ \lambda_1(P) &= \text{Orient2D}(V_2, V_0, P) / |\text{Orient2D}(V_0, V_1, V_2)|, \\ \lambda_2(P) &= \text{Orient2D}(V_0, V_1, P) / |\text{Orient2D}(V_0, V_1, V_2)| \end{aligned} \right.
  • ViV_iは三角形の頂点を表す
  • Orient2D(A,B,C)\text{Orient2D}(A, B, C)AB\vec{AB}AC\vec{AC}の外積を求める
    • AB\vec{AB}AC\vec{AC}から成る平行四辺形の符号付き面積に等しい
      • CCAB\vec{AB}の左側にあれば正になる
      • CCAB\vec{AB}の右側にあれば負になる
  • i=0,1,2i = 0, 1, 2のすべてにおいて0λi(P)10 \le \lambda_i(P) \le 1となれば、点PPは三角形の内側または境界上にある
    • このとき、λi(P)=0\lambda_i(P) = 0ならば、点PPは辺V0ViV_0V_i上にある
  • λ0(P)+λ1(P)+λ2(P)=1\lambda_0(P) + \lambda_1(P) + \lambda_2(P) = 1

ラスタライゼーション(Rasterization)

  • 三角形を”ラスタライズするrasterize”とは、その三角形の内側にあるピクセルを見つけること
    • そうして見つけたピクセルを色付けする

Top-left rule

  • ピクセルの中心が三角形の内側に入るならば、それを描画する
  • 上辺top edge左辺left edgeの上にあるピクセルを三角形の内側にあると定義する
    • 上辺は完全に水平exactly horizontalであり、他の辺より上にある
    • 左辺は完全に水平でなく、三角形の左側にある
  • これに従うと、隣接する三角形がどちらか一回だけピクセルを描画するようになる

Binning

  • Binningとは、隣接する要素をひとまとめにして扱うこと
  • スクリーンをタイルに分割して、タイルごとに処理を行う
    • 計算に必要なデータをL2キャッシュに収まるくらいに小さくできる

参考資料