導入
ラスター化は、ベクター イメージを、画面上に表示したり、印刷装置で印刷したりすることを目的としたラスター イメージに変換するプロセスです。
3次元シーンは一般にベクトル形式でメモリに保存されるため、この用語はスクリーン(マトリックス イメージを提供するスクリーン) 上でのレンダリングにも適用され、これが「ラスター化」という単語の主な使用法でもあります。さらに言えば、ラスタライズには、3D レンダリングの最終的な外観を改善することを可能にするすべてのプロセスも含まれます。
2 次元画像のラスタライズは 3D 相当の画像内で必要であるため、この記事の残りの部分では、両方の方法を同時に詳しく説明することを目的として、3 次元画像のラスタライズのみに焦点を当てます。
このプロセスは、レイ トレーシングと並ぶ 2 つの主要な 3D レンダリング技術のうちの 1 つです。レイ トレーシングと比較して、ラスタライズは計算がはるかに高速です。
基本的な幾何学的原理
3 次元ベクトル イメージから 2 次元ラスター イメージへの変換は 2 つのステップで行われます。1 つは 3D ベクトル イメージで 2D ベクトル イメージに変換し、次にこれをラスター イメージ Final 2D にラスター化します (再帰を参照)。
2D座標の計算
最初のステップは、画像のさまざまなモデルを 2D 平面に投影することです。この計算は次の 3 つのステップに要約できます。
- ワールド内のモデルの統合、「Model to World」(M2W)
- カメラの位置や角度を考慮した「World to Vue 」(W2V)
- スクリーンの寸法を考慮した「Vue to Projection」(V2P)
これらの各ステップはマトリックスに対応します。計算は、各頂点の座標と 3 つの行列の単純な乗算です。したがって、各頂点の 2D 座標と深度を取得します。
注: 現在の 3D API では、 Direct3D はこれら 3 つの行列を使用しますが、 OpenGL は実際にはワールド行列 (World) を使用せず、Vue マトリックスと結合されるため、「Model-Vue」行列 (GL_MODELVIEW) が得られます。
世界への変革モデル
M2W マトリックスは、オブジェクトに対して実行される一連の操作に対応します。これらの操作は次のとおりです。
- 回転
- 翻訳
- スケーリング
物理的な用語で言えば、M2W マトリックスをオブジェクトに適用することは、オブジェクト (モデル) に固有の参照フレームから、グラフィック シーン (世界) 内のすべてのオブジェクトに共通の参照フレームに移動することに相当すると言えます。
回転行列 * 面内回転行列: どちらか$$ { A = \left( {\begin{array}{*{20}c} {x_A } \\ {y_A } \\ \end{array}} \right);B = \left( {\begin{array}{*{20}c} {x_B } \\ {y_B } \\ \end{array}} \right) } $$そして$$ { \overline {OA} = \overline {OB} } $$$$ {\left\{ {\begin{array}{*{20}c} {x_A = \cos \alpha .\overline {OA} } \\ {y_A = \sin \alpha .\overline {OA} } \\ \end{array}} \right. } $$$$ { \left\{ {\begin{array}{*{20}c} {x_B = \cos (\alpha + \beta ).\overline {OB} } \\ {y_B = \sin (\alpha + \beta ).\overline {OB} } \\ \end{array}} \right. \Leftrightarrow } $$$$ { \left\{ {\begin{array}{*{20}c} {x_B = (\cos \alpha .\cos \beta – \sin \alpha .\sin \beta ).\overline {OB} } \\ {y_B = (\cos \alpha .\sin \beta + \sin \alpha .\cos \beta ).\overline {OB} } \\ \end{array}} \right. \Leftrightarrow } $$$$ { \left\{ {\begin{array}{*{20}c} {x_B = \cos \alpha .\overline {OA} .\cos \beta – \sin \alpha .\overline {OA} .\sin \beta } \\ {y_B = \cos \alpha .\overline {OA} .\sin \beta + \sin \alpha .\overline {OA} .\cos \beta } \\ \end{array}} \right. \Leftrightarrow } $$$$ { \left\{ {\begin{array}{*{20}c} {x_B = x_A .\cos \beta – y_A .\sin \beta } \\ {y_B = x_A .\sin \beta + y_A .\cos \beta } \\ \end{array}} \right. } $$$$ { \Rightarrow \left( {\begin{array}{*{20}c} {x_B } \\ {y_B } \\ \end{array}} \right) = \left( {\begin{array}{*{20}c} {\cos \beta } & { – \sin \beta } \\ {\sin \beta } & {\cos \beta } \\ \end{array}} \right).\left( {\begin{array}{*{20}c} {x_A } \\ {y_A } \\ \end{array}} \right) } $$- 空間内の回転行列:
ランドマークで
$$ {\left( {O,\vec i,\vec j,\vec k} \right)} $$上記の操作は、ベクトルを中心に回転することと同じです。$$ {\vec k} $$つまり、z 軸です。- z 軸の周り:
- y 軸の周り:
マーカーの表示角度と軸の名前も変更されていますが、比較すると次のように推測できます。$$ {\left. {\begin{array}{*{20}c} {\vec i \to \vec k} \\ {\vec j \to \vec i} \\ {\vec k \to \vec j} \\ \end{array}} \right\} \Rightarrow \left\{ {\begin{array}{*{20}c} {x \to z} \\ {y \to x} \\ {z \to y} \\ \end{array}} \right. } $$
すると、次のようになります。$$ {\left( {\begin{array}{*{20}c} {x_B } \\ {y_B } \\ {z_B } \\ 1 \\ \end{array}} \right) = \left( {\begin{array}{*{20}c} {\cos \beta } & 0 & {\sin \beta } & 0 \\ 0 & 1 & 0 & 0 \\ { – \sin \beta } & 0 & {\cos \beta } & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}} \right).\left( {\begin{array}{*{20}c} {x_A } \\ {y_A } \\ {z_A } \\ 1 \\ \end{array}} \right) } $$- X 軸の周り:
$$ { \left. {\begin{array}{*{20}c} {\vec i \to \vec k} \\ {\vec j \to \vec i} \\ {\vec k \to \vec j} \\ \end{array}} \right\} \Rightarrow \left\{ {\begin{array}{*{20}c} {x \to z} \\ {y \to x} \\ {z \to y} \\ \end{array}} \right. } $$すると、次のようになります。$$ { \left( {\begin{array}{*{20}c} {x_B } \\ {y_B } \\ {z_B } \\ 1 \\ \end{array}} \right) = \left( {\begin{array}{*{20}c} 1 & 0 & 0 & 0 \\ 0 & {\cos \beta } & { – \sin \beta } & 0 \\ 0 & {\sin \beta } & {\cos \beta } & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}} \right).\left( {\begin{array}{*{20}c} {x_A } \\ {y_A } \\ {z_A } \\ 1 \\ \end{array}} \right) } $$
翻訳マトリックス $$ { \left( {\begin{array}{*{20}c} {x_B } \\ {y_B } \\ {z_B } \\ 1 \\ \end{array}} \right) = \left( {\begin{array}{*{20}c} 1 & 0 & 0 & {T_x } \\ 0 & 1 & 0 & {T_y } \\ 0 & 0 & 1 & {T_z } \\ 0 & 0 & 0 & 1 \\ \end{array}} \right).\left( {\begin{array}{*{20}c} {x_A } \\ {y_A } \\ {z_A } \\ 1 \\ \end{array}} \right) } $$
スケーリング行列 $$ { \left( {\begin{array}{*{20}c} {x_B } \\ {y_B } \\ {z_B } \\ 1 \\ \end{array}} \right) = \left( {\begin{array}{*{20}c} {S_x } & 0 & 0 & 0 \\ 0 & {S_y } & 0 & 0 \\ 0 & 0 & {S_z } & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}} \right).\left( {\begin{array}{*{20}c} {x_A } \\ {y_A } \\ {z_A } \\ 1 \\ \end{array}} \right) } $$
M2Wの概要 $$ { \left[ W \right] = \underbrace {\left[ T \right].\left[ {R_x } \right]….\left[ S \right].\left[ {R_z } \right].\left[ {R_y } \right]}_{M2W}.\left[ M \right] } $$- 回転行列
- 翻訳行列
- スケーリング行列
世界から視点への変換
この行列は、実際にはカメラの位置と方向に基づいて各点の座標を計算します。
これは古典的なビュー マトリックスです。 Pos と Dir は、それぞれカメラの位置と向けられた位置を示すベクトルです。 Up ベクトルは垂直方向を示します。 Up、F、S、U はすべて正規化する必要があります。
F =位置−方向
S = F *アップ
U = S * F
ビューから投影への変換
射影行列により、計算された座標をフレームバッファ (つまり、ウィンドウまたはスクリーン) の寸法に適合させることができます。実際、座標にビュー行列を乗算した後でも、観察者がシーンをどのように認識するかを考慮する必要があります。画像の比率 (4/3、16/9 など) や視野角 (実際には 120°、通常は画面上で 45°) など、特定のパラメーターを考慮する必要があります。これがこのマトリックスの目的です。
頂点フィルタリング
各頂点の 2D 座標がわかれば、残りのレンダリングを高速化するためのさまざまな手法が存在します。
背面カリングには、各面の法線を計算し、それをカメラの向きと比較することが含まれます。 2 つの間の角度が 90° より大きい場合、面は外側を向いているため、計算する必要はありません。
面のすべての頂点の画面上の 2D 座標が表示ウィンドウの外側にある場合、それに対して残りの操作を実行する必要もありません。
2D 座標を最終画像にラスタライズする
最後の操作は、各面、線、または点を画面上のピクセルに変換することです。たとえば、座標 (2,3) から (5,3) まで行かなければならないラインは、ピクセル (2,3)、(3,3)、(4,3)、および (5,3) を塗りつぶします。ただし、斜線や三角形の内部の場合、操作は大幅に複雑になります。
このように計算された各ピクセルについて、既知の頂点の値を重み付けすることによってその特性を決定する必要があります。線の例に戻ると、左側の頂点が赤、右側の頂点が青の場合、左側の最初のピクセルは完全に赤になり、次のピクセルは赤が少し減り、青が少し強くなります。完全に青になる最後のピクセルまで同様に続きます。
Zバッファ
Z バッファの使用は、どのピクセルが他のピクセルの上にあるかを決定するための手法です。 2 つの要素が重なることは確かに一般的であり、どの要素のどの部分が表示されているかを知るために、時間の経過とともにメモリ位置にそれらの深さを記録することが可能です。
したがって、ピクセルが別の既存のピクセルを上書きする必要がある場合は、Z バッファを使用して、最初のピクセルが 2 番目のピクセルよりもカメラに近いかどうかを確認します。存在する場合、ピクセルは上書きされ、Z バッファは新しい深度値で更新されます。
Z バッファを使用しないということは、描画される最後の要素が、通常は下にあるはずであっても、必ず他の要素の上にあることを意味します。
ステンシルバッファ
ステンシル バッファーは、イメージを描画する必要がある場所をフィルターするために使用されるメモリ バッファーです。 「ステンシル」とはフランス語で「型紙」を意味します。
ステンシルと Z バッファーは非常に密接に関係しています。どちらの場合も、ピクセルをフィルター処理するかどうかが問題となるためです。 Z バッファとは異なり、特定の条件下でグラフィック プロセッサにステンシル バッファを埋めるように命令することができます。したがって、ステンシル バッファの使用は、一般に 2 つのレンダリングに基づいています。最初の部分レンダリングではステンシル バッファを埋めることができ、次にフィルタリングが適用される 2 番目の最終レンダリングが行われます。
実際の例については、記事の下部 (ドロップ シャドウと反射) を参照してください。
アンチエイリアシング

アンチエイリアスまたはアンチエイリアスは、画面上の線のエイリアスを防ぐのに役立ちます。たとえば、線が座標 (1,3) から (4,4) に向かう場合、ピクセル (1,3) と (4,4) は完全に埋める必要がありますが、ピクセル (2,3)、(2) は部分的にのみ埋めます。 、4)、(3,3)、(3,4)。
アンチエイリアスを使用しない場合、アルゴリズムは階段効果を生み出す部分的な塗りつぶしを考慮しません。アンチエイリアスを使用すると、その位置の既存の色と新しい色の加重平均を使用して部分的な塗りつぶしが実行されます。
FSAA (フル スクリーン アンチエイリアス) は、すべてのピクセルが描画された後にアンチエイリアスを適用することで構成されます。これには、突然のカラージャンプを検出し、隣接するピクセルをわずかに変更することでカラージャンプを軽減することが含まれます。
最終結果
最終結果は、フレームバッファに格納されたラスター イメージです。この画像は通常、画面またはウィンドウに表示されます。



