UnityでShaderの入力パラメータとして行列を渡す

久しぶりにCG系の話題。かなりニッチな需要だとは思うけど、UnityのShader Labのお作法の話。

UnityのShaderで、入力パラメータ(プロパティ)として渡せるデータ型を調べてたら、なんと行列(Matrix4x4)もいけるらしいと分かったのでメモしておく。
Shader Lab関連の公式ドキュメントには行列の入力についてちゃんと載っていなかったんだけど、フォーラムの方にあった。

こちらが公式ドキュメントの入力パラメータ一覧↓

ShaderLab文法:プロパティ

Properties { Property [Property …] }
プロパティのブロックを定義します。波括弧{}の中で次のように複数のプロパティを定義します。

name (“display name”, Range (min, max)) = number
floatプロパティを定義し、インスペクタ上でスライドバーがminからmaxとして表現。

name (“display name”, Color) = (number,number,number,number)
colorプロパティを定義。

name (“display name”, 2D) = “name” { options }
2Dテクスチャプロパティを定義。

name (“display name”, Rect) = “name” { options }
長方形(2のべき乗でない)テクスチャのプロパティを定義。

name (“display name”, Cube) = “name” { options }
キューブマップテクスチャのプロパティを定義。

name (“display name”, Float) = number
floatプロパティを定義

name (“display name”, Vector) = (number,number,number,number)
4コンポーネント ベクトルのプロパティを定義。


スポンサーリンク

ここに列挙されているのはGUIのInspectorからいじれる入力パラメータのみで、実はScript経由だと他の型もパラメータとして入力できるという話。


スポンサーリンク


そして、フォーラムの以下に行列(Matrix4x4)をプロパティとして渡す方法が載っている。

How to set Matrix as a Property?

Script側

...
 
public class ObjectBlur : MonoBehaviour {
    ...
    protected void LateUpdate() {
        Vector4 currentPosition = transform.position;
        currentPosition.w = 1f;
        // Calculate ModelView matrices
        Matrix4x4 _mv = CameraInfo.ViewMatrix*transform.localToWorldMatrix;
        Matrix4x4 _mvPrev = CameraInfo.PrevViewMatrix*m_prevModelMatrix;
        // Give material the matrices it needs
        m_stretchMaterial.SetMatrix("_mv", _mv);
        m_stretchMaterial.SetMatrix("_mvPrev", _mvPrev);
        m_stretchMaterial.SetMatrix("_mvInvTrans", _mv.transpose.inverse);
        m_stretchMaterial.SetMatrix("_mvpPrev", CameraInfo.PrevViewProjMatrix*m_prevModelMatrix);
        // Record our previous transform
        m_prevModelMatrix = transform.localToWorldMatrix;
    }
   
    ...
}

Shader側

Shader "Hidden/Motion Vectors" {
    SubShader {
        Tags { "RenderType"="Moving" }
        Pass {
            Fog { Mode Off }
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma fragmentoption ARB_fog_exp2
                #pragma fragmentoption ARB_precision_hint_fastest
                #include "UnityCG.cginc"
               
                ...
               
                uniform float4x4 _mv;
                uniform float4x4 _mvPrev;
                uniform float4x4 _mvInvTrans;
                uniform float4x4 _mvpPrev;
               
                ...
            ENDCG
        }
    }
    ...
}

というように、4×4の行列をパラメータとしてShaderに渡したい場合は、ScriptからMaterialクラスのSetMatrix関数を使って行列を渡せるみたい。

Material.SetMatrix

public void SetMatrix(string propertyName, Matrix4x4 matrix);
public void SetMatrix(int nameID, Matrix4x4 matrix);


スポンサーリンク

関連記事

Amazon Web ServicesでWordPress
プログラムによる景観の自動生成
3DCGのモデルを立体化するサービス
ラクガキの立体化 目標設定
Amazon EC2ログイン用の秘密鍵を無くした場合の対処方法
オープンソースハードウェア Arduino (アルドゥイーノ)
ポリゴン用各種イテレータと関数セット
AndroidもopenGLも初心者さ (でもJavaは知ってるよ)
COLMAP:オープンソースのSfM・MVSツール
ZBrushで仮面ライダー3号を造る 仮面編 リファレンス画像の表示
写真から3Dメッシュの生成・編集ができる無料ツール『Autodesk Memento』
CGWORLD CHANNEL 第21回ニコ生配信は『シン・ゴジラ』メイキングスペシャル!
3Dオブジェクトの確認・変換に便利なフリーウェア『MeshLab』
顔追跡による擬似3D表示『Dynamic Perspective』
Twitter APIのPythonラッパー『python-twitter』
ブラウザ操作自動化ツール『Selenium』を試す
ZBrushでアヴァン・ガメラを作ってみる 口のバランス調整
Open Shading Language (OSL)
ラクガキの立体化 背中の作り込み・手首の移植
オープンソースのSLAMライブラリ『Cartographer』
チャットツール用bot開発フレームワーク『Hubot』
OpenCVのための軽量GUIライブラリ『cvui』
SDカードサイズのコンピューター『Intel Edison』
シフトカーを改造してラジコン化する人達
Google Earth用の建物を簡単に作れるツール Google Building Maker 公...
OpenCVでカメラ画像から自己位置認識 (Visual Odometry)
Webスクレイピングの勉強会に行ってきた
機械学習手法『SVM(Support Vector Machine)』
Vancouver Film Schoolのデモリール
Russian3DScannerのトポロジー転送ツール『WrapX』
AR (Augmented Reality)とDR (Diminished Reality)
ZBrushでUndo Historyを動画に書き出す
Maya LTのQuick Rigを試す
CEDEC 3日目
『手を動かしながら学ぶエンジニアのためのデータサイエンス』ハンズオンセミナーに行ってきた
布のモデリング
「ベンジャミン·バトン数奇な人生」でどうやってCGの顔を作ったのか
ZBrushで仮面ライダー3号を造る 仮面編 Clay Polish
スクレイピング
ZBrushで仮面ライダー3号を造る 仮面編
Phongの表現力パネェ 材質別のPhong Shader用パラメータ一覧
トランスフォーマー/ロストエイジのメイキング

コメント