夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MRTK HandTrianglesShaderの中身を読み解く その⑧ ジオメトリシェーダーを読み解く Ⅴ

本日は土曜日なので時間をかけながら一つ一つ読み解いている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)が代入されます。