本日は土曜日なので時間をかけながら一つ一つ読み解いているMRTKのHandTrianglesShaderの中身を読み解きます。
〇Find_Nearest_B163()
ここでは3つのFloat4型の変数と1つのFloat3型の変数があります。
float4 Extra1_1_Q163; float4 Extra1_2_Q163; float4 Extra1_3_Q163; float3 Nearest_P_Q163; Find_Nearest_B163(Out_UV_1_Q154,Out_UV_2_Q154,Out_UV_3_Q154,Vec2_Q167,Transition_Q160,FadingOut_Q160,vxIn[0].posWorld,vxIn[1].posWorld,vxIn[2].posWorld,Extra1_1_Q163,Extra1_2_Q163,Extra1_3_Q163,Nearest_P_Q163);
void Find_Nearest_B163( float2 UV1, float2 UV2, float2 UV3, float2 Pulse_Origin, float Transition, bool FadingOut, float3 P1, float3 P2, float3 P3, out float4 Extra1_1, out float4 Extra1_2, out float4 Extra1_3, out float3 Nearest_P ) { float d1 = distance(UV1,Pulse_Origin); float d2 = distance(UV2,Pulse_Origin); float d3 = distance(UV3,Pulse_Origin); Extra1_1 = float4(0.0,0.0,0.0,Transition); Extra1_2 = float4(0.0,0.0,0.0,Transition); Extra1_3 = float4(0.0,0.0,0.0,Transition); if (FadingOut) { if (d1>d2 && d1>d3) { Extra1_1.x=1.0; Nearest_P = P1; } else if (d2>d3) { Extra1_2.x=1.0; Nearest_P = P2; } else { Extra1_3.x=1.0; Nearest_P = P3; } } else { if (d1<d2 && d1<d3) { Nearest_P = P1; Extra1_1.x=1.0; } else if (d2<d3) { Extra1_2.x=1.0; Nearest_P = P2; } else { Extra1_3.x=1.0; Nearest_P = P3; } } }
float2 UV1=Out_UV_1_Q154(一つ目の頂点の位置ベクトル)
float2 UV2=Out_UV_2_Q154(二つ目の頂点の位置ベクトル)
float2 UV3=Out_UV_3_Q154(三つ目の頂点の位置ベクトル)
float2 Pulse_Origin=Vec2_Q167(=Pulse_Origin)
float Transition=Transition_Q160(=Pulse()で使用された変数)
bool FadingOut=FadingOut_Q160(=Pulse()でfadeOutが≠0であればTrue)
float3 P1=vxIn[0].posWorld(=一つ目の頂点のUV座標)
float3 P2=vxIn[1].posWorld(=二つ目の頂点のUV座標)
float3 P3,=vxIn[2].posWorld(=三つ目の頂点のUV座標)
out float4 Extra1_1=Extra1_1_Q163
out float4 Extra1_2=Extra1_2_Q163
out float4 Extra1_3=Extra1_3_Q163
out float3 Nearest_P=Nearest_P_Q163
と変数がFind_Nearest_B163に代入されています。
float d1 = distance(UV1,Pulse_Origin); float d2 = distance(UV2,Pulse_Origin); float d3 = distance(UV3,Pulse_Origin); Extra1_1 = float4(0.0,0.0,0.0,Transition); Extra1_2 = float4(0.0,0.0,0.0,Transition); Extra1_3 = float4(0.0,0.0,0.0,Transition);
d1,d2,d3にはそれぞれ頂点の位置ベクトルとPulse_Originの距離が代入されます。
Extra1_1,Extra1_2,Extra_3は(0,0,0,Transition)と四元目の値にTransitionが入ります。
このTransitionはPulse_Enabledがオフの場合は1、オンの場合はfadeInとfadeOutの差を0~1に定めclipで乗算した値が代入されます。
Transition = 1.0; float fadeIn = saturate(1.0-ramp_Bid160(edge1,pulseFront,d)); float fadeOut = saturate(1.0-ramp_Bid160(pulseFront-Pulse_Width,pulseFront-Pulse_Width+Pulse_Width*0.5*Pulse_Tail_Fuzz,d)); if (Pulse_Enabled) { Transition= saturate(fadeIn-fadeOut)*clip; }
if (FadingOut) { if (d1>d2 && d1>d3) { Extra1_1.x=1.0; Nearest_P = P1; } else if (d2>d3) { Extra1_2.x=1.0; Nearest_P = P2; } else { Extra1_3.x=1.0; Nearest_P = P3; } } else { if (d1<d2 && d1<d3) { Nearest_P = P1; Extra1_1.x=1.0; } else if (d2<d3) { Extra1_2.x=1.0; Nearest_P = P2; } else { Extra1_3.x=1.0; Nearest_P = P3; } } }
FaidingOutがオンかオフかによって条件分岐が行われています。
FadingOutはPulse_Enabledがオンの場合Pulse()で定められます。
FadingOutがオンの場合
●FadingOutがオンでかつd1がd2、d3よりも大きい場合
if (FadingOut) { if (d1>d2 && d1>d3) { Extra1_1.x=1.0; Nearest_P = P1;}
Extra1_1のx成分に1.0
Neearest_PにP1=vxIn[0].posWorld(=一つ目の頂点のUV座標)が代入されます。
●FadeingOutがオンでd2が一番大きいとき
else if (d2>d3) { Extra1_2.x=1.0; Nearest_P = P2; }
Extra1_2のx成分に1.0が代入されます。
Nearest_P = にvxIn[1].posWorld(=二つ目の頂点のUV座標)が代入されます。
●FadeingOutがオンでd3が一番大きいとき
else {
Extra1_3.x=1.0;
Nearest_P = P3;
}
Extra1_3のx成分に1が代入されます。
Nearest_PにvxIn[2].posWorld(=3つ目の頂点のUV座標)が代入されます。
FadingOutがオフの場合
●FadingOutがオフでかつd1がd2、d3よりも小さい場合
if (d1<d2 && d1<d3) { Nearest_P = P1; Extra1_1.x=1.0; }
Extra1_1のx成分に1.0
Neearest_PにP1=vxIn[0].posWorld(=一つ目の頂点のUV座標)が代入されます。
●FadeingOutがオンでd2が一番小さいとき
else if (d2<d3) { Extra1_2.x=1.0; Nearest_P = P2; }
Extra1_2のx成分に1.0が代入されます。
Nearest_P = にvxIn[1].posWorld(=二つ目の頂点のUV座標)が代入されます。
●FadeingOutがオンでd3が一番小さい場合
else { Extra1_3.x=1.0; Nearest_P = P3; }
Extra1_3のx成分に1が代入されます。
Nearest_PにvxIn[2].posWorld(=3つ目の頂点のUV座標)が代入されます。
以上がFind_Nearest_B163()で行われる処理です。
まとめると
d1,d2,d3にはそれぞれ頂点の位置ベクトルとPulse_Originの距離が代入されFadeingOutがオンの場合頂点の位置ベクトルとPulseOriginの距離が一番大きい頂点の数(1~3)のExtra1_XのFloat4に(1.0,0,0,Transition)が代入されます。
FadingOutがオフの場合頂点の位置ベクトルとPulseOriginの距離が一番小さい頂点の数(1~3)のExtra1_XのFloat4に(1.0,0,0,Transition)が代入されます。