【Unity】5.4&5.5新機能を深掘り(シェーダでのビュー逆マトリクス編)

投稿者: | 2016年10月28日

はじめに

こんばんは、代表の堂前です!

前回に引き続き、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の確認

unity_5-4_invview_project

今回も検証用のプロジェクトを用意しました。

その前に「ビューの逆マトリクスとは?」という話をします。
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で確認する方法を採ります。

下がCameraから表示したものとFrame Debuggerでの確認の様子となります。
左側の矢印がCamera.cameraToWorldMatrixで、右側の矢印がUNITY_MATRIX_I_Vとなります。

unity_5-4_invview_compare0
unity_5-4_invview_compare2
unity_5-4_invview_compare1

表示桁数の違いで丸めによる表記誤差はあるものの、中身は合致していると言えるでしょう。
これで「UNITY_MATRIX_I_V」はビューの逆マトリクスというのが分かりました。

 

最後に余談ですが、5.4.0から「UNITY_MATRIX_M」というのも追加されました。
これ、なんで今まで無かったんだろうと思いますね。


 

 

【免責事項】
本サイトでの情報を利用することによる損害等に対し、株式会社ロジカルビートは一切の責任を負いません。