URPのカメラ行列を改造して遊ぶ 01 ~プロジェクション行列を改造する~
環境
Unity 2021.3.9f1
Universal RP 12.1.7
セットアップ
カメラ位置を原点に合わせ、Z軸プラス方向を向ける
Cubeを作成し、位置(0, 0, 2)に配置する
Gameビューの表示は以下のようになる
URPを改造するための準備
Packagesフォルダの中に、URPのパッケージを配置
FrameDebugger
FrameDebuggerを見ると、DrawOpaqueObjectsというパスにて立方体の描画が行われている
URPの描画を行う UniversalRenderer クラス
UniversalRenderer.csに描画ロジックが実装されている
Packages/com.unity.render-pipelines.universal@12.1.7/Runtime/UniversalRenderer.cs
不透明オブジェクトの描画パス
UniversalRenderer.cs の91行目あたりに、
不透明オブジェクトの描画を行うパスm_RenderOpaqueForwardPass
が定義されている
立方体の描画をスキップしてみる
描画パスは、EnqueuePassメソッドを実行することで、レンダーキューに登録され、描画処理が実行される。
EnqueuePassをコメントアウトすると、描画パスの実行がスキップされる
カメラ行列を改造して遊ぶ
ScriptableRenderer.csを見ると、カメラ行列の設定を行うメソッド SetCameraMatrices
が定義されている
Packages/com.unity.render-pipelines.universal@12.1.7/Runtime/ScriptableRenderer.cs
プロジェクション行列のm11を反転させてみる
プロジェクション行列があるので、m11成分を反転させてみる。
画面上に表示される3Dモデルの上下が逆になるはずである
結果は、以下のようになった。
メッシュの上下が反転し、メッシュの裏表も逆になっている
プロジェクション行列のm11を反転させたことで、頂点の並ぶ順番が逆になり、メッシュが反転していると考えられる。
プロジェクション行列のm00も反転させてみる
3Dモデルの左右が反転し、メッシュの裏表が反転した。
プロジェクション行列のm33成分をいじる
以下の2つは同じ見た目になる
- Z座標 = 3の場合の見た目
- Z座標 = 2かつ、プロジェクション行列m33 = 1 のときの見た目
プロジェクション座標変換にて、頂点のZ座標がW成分に格納されてZで除算される、という計算が行われる。
プロジェクション行列のm33に1を格納すると、W成分に1が加算されるので、
見た目上はZ座標を1増やしたのと同じような状態になります。