久しぶりに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);
関連記事
AnacondaとTensorFlowをインストールしてVi...
ZBrush 2021.6のMesh from Mask機能...
PolyPaint
Kinect for Windows V2のプレオーダー開始
Oculus Goを購入!
オープンソースの顔認識フレームワーク『OpenBR』
Windows10でPyTorchをインストールしてVSCo...
Mayaのプラグイン開発
ZBrushでアマビエを作る その2
Mitsuba 2:オープンソースの物理ベースレンダラ
Math Inspector:科学計算向けビジュアルプログラ...
ZBrushで仮面ライダー3号を造る 仮面編 リファレンス画...
ZBrushでアヴァン・ガメラを作ってみる 口内の微調整・身...
geometry3Sharp:Unity C#で使えるポリゴ...
UnityでPoint Cloudを表示する方法
ジュラシック・パークのメイキング
OpenCVでPhotoshopのプラグイン開発
OpenCVで顔のランドマークを検出する『Facemark ...
COLMAP:オープンソースのSfM・MVSツール
『ローグ・ワン/スター・ウォーズ・ストーリー』のVFXブレイ...
BlenderのPython環境にPyTorchをインストー...
『パシフィック・リム: アップライジング』のVFXブレイクダ...
MeshLab:3Dオブジェクトの確認・変換に便利なフリーウ...
このブログのデザインに飽きてきた
Autodesk Mementoでゴジラを3次元復元する
WordPressのテーマを自作する
Google App Engine上のWordPressでA...
WordPressのサーバ引っ越し方法を考える
書籍『The Art of Mystical Beasts』...
ZBrushでアヴァン・ガメラを作ってみる おでこ(?)のバ...
顔モデリングのチュートリアル
Subsurface scatteringの動画
Unityをレンダラとして活用する
オープンソースの物理ベースレンダラ『Mitsuba』をMay...
写真に3Dオブジェクトを違和感無く合成する『3DPhotoM...
ZBrushでアヴァン・ガメラを作ってみる 下半身のバランス...
ZBrushで仮面ライダー3号を造る 仮面編 ClipCur...
書籍『データビジュアライゼーションのデザインパターン20』読...
ドットインストールのWordPress入門レッスン
ZBrush用トポロジー転送プラグイン『ZWrap Plug...
インターフェイスは世界を規定する
OpenCVのバージョン3が正式リリースされたぞ


コメント