はじめに
こんばんは、代表の堂前です!
前回に引き続き、Unityの5.4&5.5系での新機能の深掘りを行っていきます。
今回は細かいネタで5.4からの実装、そしてリリースノートにも載っていない(と思われる)話です。
シェーダでのビューの逆マトリクス参照についてです。
※検証したのはMacのUnity5.4.1f1になります。
Unityで参照できるマトリクス
Unityではシェーダ内で参照できるマトリクスが幾つかあります。
それは例えば以下の様なものです。
定義名 | 内容 |
unity_ObjectToWorld | モデル(ワールド)マトリクス |
UNITY_MATRIX_V | ビューマトリクス |
UNITY_MATRIX_P | プロジェクションマトリクス |
UNITY_MATRIX_MV | モデル(ワールド)→ビューマトリクス |
UNITY_MATRIX_VP | ビュー→プロジェクションマトリクス |
UNITY_MATRIX_MVP | モデル(ワールド)→ビュー→プロジェクションマトリクス |
UNITY_MATRIX_IT_MV | モデル(ワールド)→ビューの逆マトリクス |
単純に描画する際はこれらがあれば全然事足りますが、トリッキーな所を組み込みたい時に「ビューの逆マトリクス」が欲しくなることがあります。
(ワールドの視線ベクトルを得たい、とか。)
「UNITY_MATRIX_IT_MV」がやや近いかなと思うのですが、それでもモデル成分があるので利用が限定されます。
で、恐らく5.4.0からなのですが、「UnityShaderVariables.cginc」に以下の定義が追加されていました。
UNITY_MATRIX_I_V
「_IT_」ではなく「_I_」なのは気になりますが、これはもしかしてカメラの逆マトリクスでしょうか・・・?
検証してみましょう!
UNITY_MATRIX_I_Vの確認
今回も検証用のプロジェクトを用意しました。
その前に「ビューの逆マトリクスとは?」という話をします。
3Dの世界を描画する際、座標軸の変換を行って画面を捉えます。
それは以下の段階を経て行われます。
ローカル(Local)座標系
↓
↓(unity_ObjectToWorld)
↓
ワールド(World)座標系
↓
↓(UNITY_MATRIX_V)
↓
ビュー(View)座標系
↓
↓(UNITY_MATRIX_P)
↓
プロジェクション(Projection)座標系
「ビューマトリクス」というのは、「ワールド座標系→ビュー座標系」の変換を行うためのマトリクスです。
なので「逆」は、「ビュー座標系→ワールド座標系」の変更を行うものとなります。
で、Unity上のCameraがビューの大元ですが、「Camera.cameraToWorldMatrix」で確認できそうです。
この中身が「UNITY_MATRIX_I_V」と合致すればUNITY_MATRIX_I_Vはビューの逆マトリクスと言えるので、シェーダでダミー的に以下のコードを組み込み、Frame Debuggerで確認する方法を採ります。
v.vertex = mul( mul(UNITY_MATRIX_V, UNITY_MATRIX_I_V), v.vertex );
下がCameraから表示したものとFrame Debuggerでの確認の様子となります。
左側の矢印がCamera.cameraToWorldMatrixで、右側の矢印がUNITY_MATRIX_I_Vとなります。
表示桁数の違いで丸めによる表記誤差はあるものの、中身は合致していると言えるでしょう。
これで「UNITY_MATRIX_I_V」はビューの逆マトリクスというのが分かりました。
最後に余談ですが、5.4.0から「UNITY_MATRIX_M」というのも追加されました。
これ、なんで今まで無かったんだろうと思いますね。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、株式会社ロジカルビートは一切の責任を負いません。