本日は土曜日なので時間をかけて一つ一つ読み解いている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()での処理になります。