夜風のMixedReality

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

MRTK HandTrianglesShaderの中身を読み解く その⑮ フラグメントシェーダー部を読み解くTransition_B171()

本日もMRTKのHandTrianglesShaderの中身を読み解いていきます。 昨日はフラグメントシェーダーのEdge_B168を読み解きEdge_Width、Fillter_Widthのプロパティが一体何を行っているのかを理解しました。

f:id:Holomoto-Sumire:20200531163725j:plain

redhologerbera.hatenablog.com

〇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の積が代入されます。

f:id:Holomoto-Sumire:20200601094622j:plain

Result_Q169にはAlpha_Q172とpropertyで指定される_Line_Colorの積が入ります。

f:id:Holomoto-Sumire:20200601094802j:plain

    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)

f:id:Holomoto-Sumire:20200601095347j:plain

half Line_End_Time=Line_End_Time(プロパティで指定されるLine End Timeの値 デフォルトで0.5)

half Fill_Start_Time=Fill_Start_Time(プロパティで指定されるFill Start Timeの値 デフォルトで0.5)

f:id:Holomoto-Sumire:20200601095500j:plain

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の値です。

docs.microsoft.com

Line_Color にはAlpha_Q172と_Line_Colorの積にlineFadeが加算されます。

以上がTransition_B171()関数の処理です。

Transitionのなの通り複数のパラメータを基にカラーを調整していました。