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
[COLOR="red"]       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);[/COLOR]
        // 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"
               
                ...
               
[COLOR="red"]               uniform float4x4 _mv;
                uniform float4x4 _mvPrev;
                uniform float4x4 _mvInvTrans;
                uniform float4x4 _mvpPrev;[/COLOR]
               
                ...
            ENDCG
        }
    }
    ...
}

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

Material.SetMatrix

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


スポンサーリンク

関連記事

ラクガキの立体化 1年半ぶりの続き
Zbrushでメカ物を作るチュートリアル動画
Google XML Sitemap Generatorプラグインを3.4.1へダウングレード
Seleniumを使ったFXや株の自動取引
Deep Neural Networkによる顔の個人識別フレームワーク『OpenFace』
IronPythonを使ってUnity上でPythonのコードを実行する
ZScript
AR (Augmented Reality)とDR (Diminished Reality)
WordPressのテーマを自作する
SIGGRAPH 2020はオンライン開催
書籍『開田裕治 怪獣イラストテクニック』
ジュラシック・パークの続編『ジュラシック・ワールド』
CGレンダラ研究開発のためのフレームワーク『Lightmetrica (ライトメトリカ)』
Oculus Goを購入!
服飾デザインツール『CLO』
Managing Software Requirements: A Unified Approach
UnityのMonoBehaviourクラスをシングルトン化する
単純に遊びに行くのはだめなのか?
Blender 2.81でIntel Open Image Denoiseを使う
HTML5・WebGLベースのグラフィックスエンジン『Goo Engine』
映画から想像するVR・AR時代のGUIデザイン
Blender 2.8がついに正式リリース!
顔のモデリング
第20回 文化庁メディア芸術祭『3DCG表現と特撮の時代』
Siggraph Asia 2009 カンファレンスの詳細
Maya 2015から標準搭載されたMILA
JavaによるCGプログラミング入門サイト (日本語)
C#で使える可読性重視のディープラーニングライブラリ『KelpNet』
Iterator
ZBrushと液晶ペンタブレットでドラゴンをモデリングするチュートリアル動画
mentalrayのSubsurface Scattering Shader『misss_fast_...
タマムシっぽい質感
Vancouver Film Schoolのデモリール
OpenCVの超解像処理モジュール『Super Resolution』
ミニ四駆で電子工作
SDカードサイズのコンピューター『Intel Edison』
OpenCVのための軽量GUIライブラリ『cvui』
ヘッドマウントディスプレイとビジュアリゼーションの未来
ドットインストールのWordPress入門レッスン
ZBrushのハードサーフェイス用ブラシ
OpenCVの三角測量関数『cv::triangulatepoints』
CreativeCOW.net

コメント