本日も昨日に引き続きMRTKのHandTrianglesShaderの理解を深めます。
前回はHandTrianglesShaderのプロパティからColor/IntensityとFillColorがどのように機能するのかをみました。
今回はLineColor、FillColorパラメータが何を意味するのかを追っていきます。
〇Color/LineColor
LineColorはメッシュの淵の色に当たります。
LineColorはHandTrianglesShaderのpropertes{}で以下のように記述されています。
_Line_Color_("Line Color", Color) = (0.717647,0.717647,0.717647,1)
Line_Colorは786行目で次のように使用されています。
half4 Result_Q169 = Alpha_Q172 * _Line_Color_;
Alpha_Q172との積がResult_Q169に代入されます。
このAlpha_Q172はfragmentInputのextra2(UV座標)の四元成分wに当たります。
試しに786行目のAlha_Q172を消してみました。
half4 Result_Q169 = _Line_Color_;
すると以下のように変化しました。
この処理はカラースケール(色の明るさ)を処理しています。
Result_Q169はTransition_B171関数でLine_Color_Baseとして使用されています。
void Transition_B171( half Fuzz, half4 Fill_Color_Base, half4 Line_Color_Base, half4 V, half4 Transition, half Tip_Bump, half Line_End_Time, half Fill_Start_Time, out half4 Fill_Color, out half4 Line_Color ) { float fillProgress = saturate((Transition.w-Fill_Start_Time)/(1.0-Fill_Start_Time)); //float t = Transition.w*2.0; //float3 d = (V.xyz-float3(0.5,0.5,0.5))*2.0; //float fillTransition = max(0.0,t-1.0); Fill_Color.rgb = Fill_Color_Base.rgb * fillProgress; //* sqrt(dot(d,d)) Fill_Color.a = fillProgress; float lineProgress = saturate(Transition.w/Line_End_Time); float Edge = 1.0-lineProgress; float k = Transition.x*(1.0-Fuzz)+Fuzz; float k2 = saturate(smoothstep(Edge, Edge+Fuzz, k)); float lineFade = (1.0+Tip_Bump*sqrt(Edge))*k2; //lineProgress; Line_Color = Line_Color_Base * lineFade; }
Line_Color = Line_Color_Base * lineFade;
Line_ColorはLine_Color_Baseとlinefadeの積です。
k2には最小値Edge、最大値Edge+Fuzzでのextra1のx成分と1からFuzz(プロパティで指定されるPulse Line Fuzzの値)を引いた値の積にFuzzを加算した値に対するエルミート補間が代入されます。
extra1はextra2とは別のUV座標です。この値とプロパティで指定されるPulseAmplifLeadingの値(デフォルトで0)とEdgeの平方根の積を1に加算した値との積がlineFadeになります。
このlineFadeが強度としてLine_Color_BaseでLine_Color_Q171に与えられます。
この793行目で
half4 Color_At_T_Q173 = lerp(Fill_Color_Q171, Line_Color_Q171,float4( inLine_Q168, inLine_Q168, inLine_Q168, inLine_Q168));
でinLine_Q168でFill_Color_Q171とLine_Color_Q171の間で色の補間が行われています。
例えばこの793行目を次のようにFill_Color_Q171とLine_Color_Q171の順番を入れ替えると
half4 Color_At_T_Q173 = lerp( Line_Color_Q171, Fill_Color_Q171, float4( inLine_Q168, inLine_Q168, inLine_Q168, inLine_Q168));
というようにFillColorとLineColorが入れ替わります。
以上がLineColorの働きになります。