🌈

そろそろShaderをやるパート61 ビューイングパイプラインについて整理する

2022/03/19に公開

そろそろShaderをやります

そろそろShaderをやります。そろそろShaderをやりたいからです。
パート100までダラダラ頑張ります。10年かかってもいいのでやります。
100記事分くらい学べば私レベルの初心者でもまあまあ理解できるかなと思っています。

という感じでやってます。

※初心者がメモレベルで記録するので
 技術記事としてはお力になれないかもしれません。

ビューイングパイプライン

ビューイングパイプラインは、図形が定義されて、変換を受けて最終的に出力されるまでの過程のこと。

【引用元】:ビューイングパイプライン

CG空間という仮想世界で定義された図形は、実際に画面上に表示されるまでにさまざまな座標系の変換を経由し表示されます。

以下がその流れを図示したものです。

【引用元】:4.ビューイングパイプライン

それぞれの変換について詳しくみていきます。

モデリング変換

モデリング変換とはモデリング座標系からワールド座標系への変換のことを指します。
モデリング座標系を定義することで、モデルそれぞれに原点を定義することができ、ワールド座標系で移動するたびにモデルの形状を定義しなおす必要がなくなります。

例えば以下の図のような立方体が存在し、その立方体の中心にモデリング座標系の原点が存在するとします。

この場合、立方体の形状を座標で表す際にはその座標を固定することが可能です。
すなわち、ワールド座標系で物体を動かすだけであれば、頂点を操作する必要はなく、モデリング変換時に適用する値を変化させればよいということになります。

視野変換

視野変換とはワールド座標系からカメラ座標系への変換のことを指します。
CG空間という仮想世界の中では、現実世界における私たちの目の代わりとなるカメラが存在します。カメラ座標系の原点はカメラの視点であり、Z軸の負の方向が視線の方向となります。

この変換により、カメラは自身の座標系でオブジェクトの座標を考えることができます。

投影変換

投影変換とはカメラ座標系から投影座標系への変換のことを指します。
立体をどのようにして平面スクリーンに投影するかの変換を行います。
投影変換には透視投影、平行投影の二種類が存在します。
超簡単に言うと、透視投影は奥行き有り、平行投影は奥行き無しとなります。

投影変換については過去記事でビューイングパイプラインの解説をすっ飛ばしてまとめています。
【参考リンク】:そろそろShaderをやるパート55 プロジェクション座標変換のフローを可視化する

以下のGIFはカメラ座標系に対して透視投影の処理を行ったものをシミュレートしたものです。
もっと平たく言うと"立体を平面スクリーンに奥行きを表現した状態で投影するまでの動き"をシミュレートしています。

この時、投影座標系はx,yがそれぞれ-1≦x≦1,-1≦y≦1の範囲に収まります。
この投影座標のx,yの範囲は画面上に実際に表示される範囲となります。
この時の画面の座標系をデバイス座標系と言います。

ビューポート変換

ビューポート変換とは"デバイス座標系における最終的な表示範囲"を指定された画面の範囲にちょうど収まる状態への変換のことを指します。

ビューポートとは"指定された画面の範囲"のことです。
つまり、簡単に言うとビューポート変換は"最終的な描画範囲をスクリーンの大きさに合わせる変換"ということです。

MVP変換

ここまで説明したモデリング変換、視野変換、投影変換がUnityのShaderでよく登場するMVP変換です。

UnityのShaderにおいてはUnityObjectToClipPos(v)がMVP変換の処理を各頂点に対して行ってくれています。

それぞれの変換において座標の移動、回転、拡大縮小などの処理が必要となります。
またその計算に行列を用いることで効率良く処理することができます。

行列を使うメリット等については以下の記事でまとめています。
【参考リンク】:そろそろShaderをやるパート56 行列を理解する(平行移動編)
【参考リンク】:そろそろShaderをやるパート57 行列を理解する(回転編)
【参考リンク】:そろそろShaderをやるパート58 行列を理解する(拡大縮小編)

参考リンク

【初心者Unity】ビューポート座標の使い方(画面の端を取得)
3次元座標変換のメモ書き
コンピュータグラフィックス基礎
【Unity】MVP行列による座標変換の概念と用語の整理
MVP行列による座標変換について
コンピューターグラフィックス基礎のメモ
【Unity】【シェーダ】スクリーンに対してテクスチャをマッピングする方法を完全解説する
【Unity】プロジェクション行列は掛けるだけじゃなくてw除算しなきゃダメだよという話
UnityのCameraが使う3つの座標系

Discussion