Open1

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増やしたのと同じような状態になります。