開発環境 : Unity2018.4.3f1
こちらの記事ではUnityのShaderでParticleSystemのCustomDataを利用するときの処理を共通化についてになります。
具体的にはテクスチャのUVスクロールをCustomDataで実現する場合になります。
cgincで共通のコードを定義
UnityのShaderを書く際に重複コードになりそうな処理をcgincにまとめておくことができます。
今回は次のようなコードを定義しました。
# ifndef My_PARTICLE_INCLUDED
# define My_PARTICLE_INCLUDED
// CustomDataのプロパティ設定
# define SET_CUSTOM_DATA_PROPERTY(name) uniform int name##U; \
uniform int name##USwizzle; \
uniform int name##V; \
uniform int name##VSwizzle;
// 該当のCustomDataを取得
# define GET_CUSTOM_DATA(name) half2(customData[name##U][name##USwizzle],customData[name##V][name##VSwizzle])
# endif
SET_CUSTOM_DATA_PROPERTY
は4つプロパティを定義している箇所をまとめています。
GET_CUSTOM_DATA
はプロパティで設定した値を使ってCustomDataから必要なパラメータを取得しています。
Shaderで利用する
プロパティ定義する
[HideInInspector]_MainU ("_mainucoord", int) = 2
[HideInInspector]_MainUSwizzle ("_mainuswizzle", int) = 0
[HideInInspector]_MainV ("_mainvcoord", int) = 2
[HideInInspector]_MainVSwizzle ("_mainvswizzle", int) = 0
cgincをSubShaderのPassに定義します。
# include "my_Particle.cginc"
Passにプロパティを定義します。
ここで SET_CUSTOM_DATA_PROPERTY
を使います。
SET_CUSTOM_DATA_PROPERTY(_Main);
UVスクロール
バーテックスShaderでの処理を次のようになります。
customData1とcustomData2
はCustomDataのストリームです。
half4x4 customData = { v.customCoords1, v.customCoords2, half4(0,0,0,0), half4(0,0,0,0)};
half2 mainCustomCoord = GET_CUSTOM_DATA(_Main);
o.uv.xy = TRANSFORM_TEX(v.texcoords.xy,_MainTex) + mainCustomCoord;
最後に
cgincに定義をしておけば複数のShaderで使い回すことができますので、共通化して利用できそうな処理があればまとめておくと良いです。