.wp-block-jetpack-rating-star span.screen-reader-text { border: 0; clip: rect(1px, 1px, 1px, 1px); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; word-wrap: normal; }

サイトアイコン NegativeMindException

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);


スポンサーリンク

関連記事

python-twitterで自分のお気に入りを取得する

UnityのuGUIチュートリアル

OpenMayaRender

BlenderのRigifyでリギング

hloc:SuperGlueで精度を向上させたSfM実装

OpenMVS:Multi-View Stereoによる3次元復元ライブラリ

ラクガキの立体化 進捗

Windows Server 2008にAutodesk Maya 2009をインストール

Google App Engine上のWordPressでFlickrの画像を貼る

Pythonの自然言語処理ライブラリ『NLTK(Natural Language Toolkit)』

リアルタイム レイトレーシングAPI『DirectX Raytracing (DXR)』

続・ディープラーニングの資料

Google XML Sitemap Generatorプラグインを3.4.1へダウングレード

ZBrushでアヴァン・ガメラを作ってみる 全体のバランス調整 その2

FCN (Fully Convolutional Network):ディープラーニングによるSema...

Kinect for Windows V2のプレオーダー開始

ZBrush4新機能ハイライト 3DCG CAMP 2010

組み込み向けのWindows OS 『Windows Embedded』

Kornia:微分可能なコンピュータービジョンライブラリ

C++始めようと思うんだ

日立のフルパララックス立体ディスプレイ

ポリゴン用各種イテレータと関数セット

JavaScriptとかWebGLとかCanvasとか

Google App Engineのデプロイ失敗

NeRF (Neural Radiance Fields):深層学習による新規視点合成

FreeMoCap Project:オープンソースのマーカーレスモーションキャプチャ

Raspberry Piでセンサーの常時稼働を検討する

C++ 標準テンプレートライブラリ (STL)

書籍『OpenCV 3 プログラミングブック』を購入

Unite 2014の動画

ZBrushでアヴァン・ガメラを作ってみる 壊れたデータの救出

ZBrushで仮面ライダー3号を造る 仮面編 失敗のリカバー

CEDEC 3日目

openMVG:複数視点画像から3次元形状を復元するライブラリ

OpenVDB:3Dボリュームデータ処理ライブラリ

ポイントクラウドコンソーシアム

Dlib:C++の機械学習ライブラリ

科学技術計算向けスクリプト言語『Julia』

OpenCVで動画の手ぶれ補正

UnityユーザーがUnreal Engineの使い方を学ぶには?

GoB:ZBrushとBlenderを連携させるアドオン

uGUI:Unityの新しいGUI作成システム

モバイルバージョンを終了