本日もShaderの勉強枠です。
本日はより実践的なShaderを読み解く一つとしてMixedRealityToolkitに同梱されているPulseShaderからHandTrianglesShaderを読み解きます。
〇Properties
ここではUnityのマテリアルで扱えるパラメーターが記述されます。
Properties {
[Header(Colors)]
_Intensity_("Intensity", Range(0,5)) = 5
_Fill_Color_("Fill Color", Color) = (0.317647,0.317647,0.317647,1)
_Line_Color_("Line Color", Color) = (0.717647,0.717647,0.717647,1)
[Toggle(USE_ALBEDO_TEXTURE)] USE_ALBEDO_TEXTURE("USE ALBEDO TEXTURE", Float) = 1
[NoScaleOffset] _Color_Map_("Color Map", 2D) = "" {}
_Vary_UV_("Vary UV", Range(0,1)) = 0.71
_Vary_Color_("Vary Color", Range(0,1)) = 0.7
_Desaturated_Intensity_("Desaturated Intensity", Range(0,1)) = 0
[Header(Edges)]
_Edge_Width_("Edge Width", Range(0,10)) = 1
_Filter_Width_("Filter Width", Range(1,5)) = 1.5
[Header(Pulse)]
[Toggle] _Pulse_Enabled_("Pulse Enabled", Float) = 1
_Pulse_("Pulse", Range(0,1)) = 0.346
_Pulse_Width_("Pulse Width", Range(0,5)) = 1
_Pulse_Outer_Size_("Pulse Outer Size", Range(0,2)) = 1.05
_Pulse_Lead_Fuzz_("Pulse Lead Fuzz", Range(0,1)) = 0.67
_Pulse_Tail_Fuzz_("Pulse Tail Fuzz", Range(0,1)) = 0.8
_Pulse_Vary_("Pulse Vary", Range(0,1)) = 0.075
_Pulse_Line_Fuzz_("Pulse Line Fuzz", Range(0.01,1)) = 0.2
_Pulse_Noise_Frequency_("Pulse Noise Frequency", Range(0,2000)) = 777
_Pulse_Origin_("Pulse Origin", Vector) = (0.5, 0, 0, 0)
_Pulse_Color_Width_("Pulse Color Width", Range(0,1)) = 1
_Pulse_Amplify_Leading_("Pulse Amplify Leading", Range(0,2)) = 0
[Header(AutoPulse)]
[Toggle] _Auto_Pulse_("Auto Pulse", Float) = 1
_Period_("Period", Float) = 2.7
[Header(Edge Timing)]
_Line_End_Time_("Line End Time", Range(0,1)) = 0.5
_Fill_Start_Time_("Fill Start Time", Range(0,1)) = 0.5
[Header(Wrist Fade)]
_Wrist_Fade_Start_("Wrist Fade Start", Range(0,1)) = 0.1
_Wrist_Fade_End_("Wrist Fade End", Range(0,1)) = 0.16
[Header(Flip V For Hydrogen)]
[Toggle] _Flip_V_("Flip V", Float) = 0
[Header(Fly)]
_Max_Hover_("Max Hover", Range(0,1)) = 0.004
_Max_In_Angle_("Max In Angle", Range(0,2)) = 0.6
_Max_Out_Angle_("Max Out Angle", Range(0,2)) = 0.4
}
●Colors
このプロパティではPulseの塗りつぶしの色、Edge(メッシュのアウトライン)の色、Color Mapでテクスチャを設定することができます。


[Header(Colors)]
_Intensity_("Intensity", Range(0,5)) = 5
_Fill_Color_("Fill Color", Color) = (0.317647,0.317647,0.317647,1)
_Line_Color_("Line Color", Color) = (0.717647,0.717647,0.717647,1)
[Toggle(USE_ALBEDO_TEXTURE)] USE_ALBEDO_TEXTURE("USE ALBEDO TEXTURE", Float) = 1
[NoScaleOffset] _Color_Map_("Color Map", 2D) = "" {}
_Vary_UV_("Vary UV", Range(0,1)) = 0.71
_Vary_Color_("Vary Color", Range(0,1)) = 0.7
_Desaturated_Intensity_("Desaturated Intensity", Range(0,1)) = 0

ここで
[Toggle(USE_ALBEDO_TEXTURE)] USE_ALBEDO_TEXTURE("USE ALBEDO TEXTURE", Float) = 1
属性[Toggle]はそのあとに続くプロパティをチェックボックスにします。(オン/オフ)
[NoScaleOffset] _Color_Map_("Color Map", 2D) = "" {}
の属性[NoScaleOffse]はそのあとに続くテクスチャのTilingとOffsetを非表示にするものです。
● Edges
Edge(メッシュのアウトライン)の太さ、ぼかしを設定することができます。


[Header(Edges)]
_Edge_Width_("Edge Width", Range(0,10)) = 1
_Filter_Width_("Filter Width", Range(1,5)) = 1.5

●Pulse
このShaderの肝となるプロパティです。
Pulseの周期の長さや大きさ、Pulse自体のぼかしなどを調整することができます。
[Header(Pulse)]
[Toggle] _Pulse_Enabled_("Pulse Enabled", Float) = 1
_Pulse_("Pulse", Range(0,1)) = 0.346
_Pulse_Width_("Pulse Width", Range(0,5)) = 1
_Pulse_Outer_Size_("Pulse Outer Size", Range(0,2)) = 1.05
_Pulse_Lead_Fuzz_("Pulse Lead Fuzz", Range(0,1)) = 0.67
_Pulse_Tail_Fuzz_("Pulse Tail Fuzz", Range(0,1)) = 0.8
_Pulse_Vary_("Pulse Vary", Range(0,1)) = 0.075
_Pulse_Line_Fuzz_("Pulse Line Fuzz", Range(0.01,1)) = 0.2
_Pulse_Noise_Frequency_("Pulse Noise Frequency", Range(0,2000)) = 777
_Pulse_Origin_("Pulse Origin", Vector) = (0.5, 0, 0, 0)
_Pulse_Color_Width_("Pulse Color Width", Range(0,1)) = 1
_Pulse_Amplify_Leading_("Pulse Amplify Leading", Range(0,2)) = 0

●AutoPulse
このプロパティでは、自動的にPulseを発生させる機能とそのPulseの周期を設定できます。
スクリプトなどで外部からPulseを扱う場合や、不規則なPulseを行うなどの場合を除いてこのチェックボックスを有効にしない場合Pulseを扱うことができません。
[Header(AutoPulse)]
[Toggle] _Auto_Pulse_("Auto Pulse", Float) = 1
_Period_("Period", Float) = 2.7

● Edge Timing
HandTriangles ShaderのPulseではLine(メッシュのアウトライン)、Fill(メッシュの塗りつぶし)と大きく分けて二つの小さなPulseを表現できます。
EdgeTimingはPulseの読み込み時のLineのPulseの読み込み終了時間、FillのPulseの開始時間を設定できます。
この設定次第ではEdge(メッシュのアウトライン)が描画される前に塗りつぶしを先に描画することもできます。

[Header(Edge Timing)]
_Line_End_Time_("Line End Time", Range(0,1)) = 0.5
_Fill_Start_Time_("Fill Start Time", Range(0,1)) = 0.5

●Wrist Fade
HandTriangles ShaerはHoloLens 2のHandTrackingでの手のオブジェクトの表現に使われますが、このパラメータは手首部のフェード(減衰)を設定できます。
[Header(Wrist Fade)]
_Wrist_Fade_Start_("Wrist Fade Start", Range(0,1)) = 0.1
_Wrist_Fade_End_("Wrist Fade End", Range(0,1)) = 0.16

●Flip V For Hydrogen
このチェックボックスを有効化するとPulseの方向が反転します。
[Header(Flip V For Hydrogen)]
[Toggle] _Flip_V_("Flip V", Float) = 0

●Fly
Pulseのはじめ、終わりのそれぞれのMeshの展開の大きさ、メッシュの方向を設定できます。

[Header(Fly)]
_Max_Hover_("Max Hover", Range(0,1)) = 0.004
_Max_In_Angle_("Max In Angle", Range(0,2)) = 0.6
_Max_Out_Angle_("Max Out Angle", Range(0,2)) = 0.4

以上がHandTrianglesShaderのpropertiesになります。
扱えるプロパティの数が多いですが、基本的な記述になっています。