夜風のMixedReality

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

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

本日は土曜日なので時間をかけて一つ一つ読み解いているMRTK HandTrianglesShaderのジオメトリーシェーダーの中身を読み解いています。

        bool Next_Q177;
        Emit_Triangle_B177(false,Q0_Q164,Q1_Q164,Q2_Q164,Extra1_1_Q163,Extra1_2_Q163,Extra1_3_Q163,Result_Q161,Wrist_1_Q153,Wrist_2_Q153,Wrist_3_Q153,Transition_Q160,Next_Q177);

        bool Root = Next_Q177;
                    void Emit_Triangle_B177(
        bool Previous,
        float3 P1,
        float3 P2,
        float3 P3,
        float4 Extra1_1,
        float4 Extra1_2,
        float4 Extra1_3,
        float4 Color,
        float Wrist_1,
        float Wrist_2,
        float Wrist_3,
        float Transition,
        out bool Next    )
    {
        
        float2 uv;
        
        float t = Transition>0.0 ? 1.0 : 0.0;
        float3 p2 = P1 + (P2-P1)*t;
        float3 p3 = P1 + (P3-P1)*t;
        
        uv = float2(0,0);
        emitVertex_Bid177(P1,Extra1_1,Color*Wrist_1,float4(1.0,0.0,0.0,0.0));
        
        uv = float2(1,0);
        emitVertex_Bid177(p2,Extra1_2,Color*Wrist_2,float4(0.0,1.0,0.0,0.0));
        
        uv = float2(0,1);
        emitVertex_Bid177(p3,Extra1_3,Color*Wrist_3,float4(0.0,0.0,1.0,0.0));
        
        stripCount+=1; stripVxCount[stripCount]=0;
        
        Next = Previous;
        
    }

各引数には次のように値が代入されます。

    bool Previous=false

    float3 P1=Q0_Q164(Fly()で処理されるRotate_Bid164()のangle,center,axis,P1での帰り値)

    float3 P2=Q1_Q164(Fly()で処理されるRotate_Bid164()のangle,center,axis,P2での帰り値)

    float3 P3=Q2_Q164(Fly()で処理されるRotate_Bid164()のangle,center,axis,P3での帰り値)

    float4 Extra1_1=Extra1_1_Q163(Find_Nearest_B163()で処理されるExtra1_1 )

    float4 Extra1_2=Extra1_2_Q163(Find_Nearest_B163()で処理されるExtra1_2 )

    float4 Extra1_3=Extra1_3_Q163(Find_Nearest_B163()で処理されるExtra1_3 )

    float4 Color=Result_Q161(677行目で処理されるカラー)

    float Wrist_1=Wrist_1_Q153(Average_Q153で処理されるWrist1)

    float Wrist_2=Wrist_2_Q153(Average_Q153で処理されるWrist2)

    float Wrist_3=Wrist_3_Q153(Average_Q153で処理されるWrist3)

    float Transition=Transition_Q160(Pulse()で使用された変数)

    out bool Next =Next_Q177
        float2 uv;
        
        float t = Transition>0.0 ? 1.0 : 0.0;
        float3 p2 = P1 + (P2-P1)*t;
        float3 p3 = P1 + (P3-P1)*t;

tにはTransitionの値が0より大きいなら1.0,そうではないなら0.0が代入されます。

p2にはP2-P1の値にtが積算されます(tは0か1)この値とP1の和が代入されます。 つまりTransitionが0もしくは負の値であれでp2にはそのままP1の値が代入されます。

p3もp2同様P3-P1の値とtとの積がP1に加算されます。

        uv = float2(0,0);
        emitVertex_Bid177(P1,Extra1_1,Color*Wrist_1,float4(1.0,0.0,0.0,0.0));
        
        uv = float2(1,0);
        emitVertex_Bid177(p2,Extra1_2,Color*Wrist_2,float4(0.0,1.0,0.0,0.0));
        
        uv = float2(0,1);
        emitVertex_Bid177(p3,Extra1_3,Color*Wrist_3,float4(0.0,0.0,1.0,0.0));
        
        stripCount+=1; stripVxCount[stripCount]=0;
        
        Next = Previous;

uvには(0,0)が代入されます。

  void emitVertex_Bid177(float3 P, float4 extra1, float4 C, float4 extra3)
              {
                vxOut[vxOutCount].posWorld = P; vxOut[vxOutCount].pos = mul(unity_MatrixVP, float4(P,1.0f));;
                HUX_GEO_SET_EXTRA1(extra1);
                HUX_GEO_SET_EXTRA2(C);
                HUX_GEO_SET_EXTRA3(extra3);
                vxOutCount += 1; stripVxCount[stripCount] += 1;
              }

emitVertex_Bid177()では次の値がそれぞれ代入されます。

float3 P=P1

float4 extra1=Extra1_1_Q163(Find_Nearest_B163()で処理されるExtra1_1 )

float4 C=ColorとWrist_1の積

float4 extra3=float4(1.0,0.0,0.0,0.0)

 vxOut[vxOutCount].posWorld = P; vxOut[vxOutCount].pos = mul(unity_MatrixVP, float4(P,1.0f));;

vxOut[vxOutCount].posWorld(ワールド座標)にはP、vxOut[vxOutCount].pos(座標) は(P.x,P.y,P.z,1.0)でワールド座標からビューポイント座標に変換します。(シェーダーで扱う座標とUnityの座標をそろえる。)

               HUX_GEO_SET_EXTRA1(extra1);
                HUX_GEO_SET_EXTRA2(C);
                HUX_GEO_SET_EXTRA3(extra3);

これはHUX_GEO_SETにかかわる処理です。 この辺りは167~196行目に記述されています。

           #ifndef HUX_GEO_SET_UV
                  #define HUX_GEO_SET_UV(A)
              #endif

              #ifndef HUX_GEO_SET_NORMAL
                  #define HUX_GEO_SET_NORMAL(A)
              #endif

              #ifndef HUX_GEO_SET_TANGENT
                  #define HUX_GEO_SET_TANGENT(A)
              #endif

              #ifndef HUX_GEO_SET_COLOR
                  #define HUX_GEO_SET_COLOR(A)
              #endif

            #define HUX_GEO_SET_EXTRA1(A) vxOut[vxOutCount].extra1=A;
              #ifndef HUX_GEO_SET_EXTRA1
                  #define HUX_GEO_SET_EXTRA1(A)
              #endif

            #define HUX_GEO_SET_EXTRA2(A) vxOut[vxOutCount].extra2=A;
              #ifndef HUX_GEO_SET_EXTRA2
                  #define HUX_GEO_SET_EXTRA2(A)
              #endif

            #define HUX_GEO_SET_EXTRA3(A) vxOut[vxOutCount].extra3=A;
              #ifndef HUX_GEO_SET_EXTRA3
                  #define HUX_GEO_SET_EXTRA3(A)
              #endif

ところが、このHUX_GEO_SET_○○というのはこーどのどこでも呼ばれておらず、参照されていません。

この辺りが HandTrianglesShaderの冒頭に記述されている

Note, this shader is generated from a tool and is not formated for user readability.

なのでしょう(難しい…)

vxOutCount += 1; stripVxCount[stripCount] += 1;

int vxOutCountとstripCxCount[stripCount]に1を加算します。

vxOutCountは613行目で

vxOutCount = 0;

0が代入されているのでおそらく1になります。

 stripVxCount[0] = 0;

stripVxCount[0]も615行目で0が代入されているのでおそらく1になります。

  Next = Previous;

PreviousはfaulseなのでNestもfaulseとなります。

以上がEmit_Triangle_B177()での処理になります。