本日もMRTKのHandTrianglesShaderの中身を読み解いていきます。 昨日はフラグメントシェーダーのEdge_B168を読み解きEdge_Width、Fillter_Widthのプロパティが一体何を行っているのかを理解しました。
〇Split_Color_Alpha_B172()
half4 Color_Q172; half Alpha_Q172; Split_Color_Alpha_B172(fragInput.extra2,Color_Q172,Alpha_Q172);
void Split_Color_Alpha_B172( half4 Vector4, out half4 Color, out half Alpha ) { Color = Vector4; Alpha = Vector4.w; }
Split_Color_Alpha_B172()の引数は以下のように代入されます。
half4 Vector4=flagInput.extra2(flagInputのTEXCOORD5=UV座標)
out half4 Color=Color_Q172
out half Alpha=Alpha_Q172
Split_Color_Alpha_B172の内部では次のように処理が行われます。
Color=Vector4; Alpha=Vector4.w;
ColorにはVector4、つまりflagInputのextra2が代入されます。
Alphaにはextraの4元が代入されます。
〇Transition_B171()
// Multiply_Colors half4 Product_Q170 = _Fill_Color_ * Color_Q172; // Scale_Color half4 Result_Q169 = Alpha_Q172 * _Line_Color_; half4 Fill_Color_Q171; half4 Line_Color_Q171; Transition_B171(_Pulse_Line_Fuzz_,Product_Q170,Result_Q169,fragInput.extra3,fragInput.extra1,_Pulse_Amplify_Leading_,_Line_End_Time_,_Fill_Start_Time_,Fill_Color_Q171,Line_Color_Q171);
Product_Q170にはプロパティで指定される_Fill_ColorとColor_Q172の積が代入されます。
Result_Q169にはAlpha_Q172とpropertyで指定される_Line_Colorの積が入ります。
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; }
Transition_B171()の引数は次のように代入されます。
half Fuzz=Pulse_Line_Fuzz(プロパティで指定されるPulse Line Fuzzの値 デフォルトで0.2)
half4 Fill_Color_Base=Product_Q170(_Fill_ColorとColor_Q172の積)
half4 Line_Color_Base=Result_Q169(Alpha_Q172と_Line_Colorの積)
half4 V=fragInput.extra3(fragInputのextra3(UV座標))
half4 Transition=fragInput.extra1(fragInputのextra1(UV座標))
half Tip_Bump=Pulse_Amplify_Leading(プロパティで指定されるPulseAmplifLeadingの値 デフォルトで0)
half Line_End_Time=Line_End_Time(プロパティで指定されるLine End Timeの値 デフォルトで0.5)
half Fill_Start_Time=Fill_Start_Time(プロパティで指定されるFill Start Timeの値 デフォルトで0.5)
out half4 Fill_Color=Fill_Color_Q171
out half4 Line_Color=Line_Color_Q171
float fillProgress = saturate((Transition.w-Fill_Start_Time)/(1.0-Fill_Start_Time));
fillProgressにはfragInput.extra1のw成分から-Fill_Start_Timeを引いた値から1からFill_Start_Timeを引いた値を割り0~1の範囲に収めた値が代入されます。
Fill_Color.rgb = Fill_Color_Base.rgb * fillProgress; //* sqrt(dot(d,d)) Fill_Color.a = fillProgress;
Fill_Color.rgbには_Fill_ColorとColor_Q172の積のrgb成分にfillProgressが積算されます。
Fill_Colorのa成分にはfillProgressがそのまま代入されます(FillProgressは0~1の値を取るのでそのままα値として使用されるようです。)
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;
lineProgress にはextra1のw成分をLine_End_Timeで割った値を0~1の範囲に収めたものが代入されます。
Edgeには1からlineProgressを引いた残りが入ります。この値は0~1を取ります。
kにはextra1のx成分と1からFuzz(プロパティで指定されるPulse Line Fuzzの値)を引いた値の積にFuzzを加算した値が代入されます。
k2には最小値Edge、最大値Edge+Fuzzでのkに対するエルミーと補間(つまりFuzzの幅)が代入されます。
lineFadeには1にTip_Bumpとsqrt(Edge)との積を加算した値とk2との積が代入されます。
ここでsqrt(Edge)はEdgeの正の平方根(ルート)を取ります。Tip_Bumpはプロパティで指定されるPulseAmplifLeadingの値です。
Line_Color にはAlpha_Q172と_Line_Colorの積にlineFadeが加算されます。
以上がTransition_B171()関数の処理です。
Transitionのなの通り複数のパラメータを基にカラーを調整していました。