夜風のMixedReality

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

HandTrianglesShaderの理解を深める Color/LineColor

本日も昨日に引き続きMRTKのHandTrianglesShaderの理解を深めます。

前回はHandTrianglesShaderのプロパティからColor/IntensityとFillColorがどのように機能するのかをみました。

redhologerbera.hatenablog.com

今回はLineColor、FillColorパラメータが何を意味するのかを追っていきます。

〇Color/LineColor

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

LineColorはメッシュの淵の色に当たります。

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

LineColorはHandTrianglesShaderのpropertes{}で以下のように記述されています。

  _Line_Color_("Line Color", Color) = (0.717647,0.717647,0.717647,1)

Line_Colorは786行目で次のように使用されています。

        half4 Result_Q169 = Alpha_Q172 * _Line_Color_;

Alpha_Q172との積がResult_Q169に代入されます。

このAlpha_Q172はfragmentInputのextra2(UV座標)の四元成分wに当たります。

試しに786行目のAlha_Q172を消してみました。

        half4 Result_Q169 = _Line_Color_;

すると以下のように変化しました。

f:id:Holomoto-Sumire:20200604092851j:plain
half4 Result_Q169 = Line_Color;

f:id:Holomoto-Sumire:20200604093055j:plain
half4 Result_Q169 = Alpha_Q172 * Line_Color;

この処理はカラースケール(色の明るさ)を処理しています。

Result_Q169はTransition_B171関数でLine_Color_Baseとして使用されています。

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;
        
    }
Line_Color = Line_Color_Base * lineFade;

Line_ColorはLine_Color_Baseとlinefadeの積です。

k2には最小値Edge、最大値Edge+Fuzzでのextra1のx成分と1からFuzz(プロパティで指定されるPulse Line Fuzzの値)を引いた値の積にFuzzを加算した値に対するエルミート補間が代入されます。

extra1はextra2とは別のUV座標です。この値とプロパティで指定されるPulseAmplifLeadingの値(デフォルトで0)とEdgeの平方根の積を1に加算した値との積がlineFadeになります。

このlineFadeが強度としてLine_Color_BaseでLine_Color_Q171に与えられます。

この793行目で

   half4 Color_At_T_Q173 = lerp(Fill_Color_Q171, Line_Color_Q171,float4( inLine_Q168, inLine_Q168, inLine_Q168, inLine_Q168));

でinLine_Q168でFill_Color_Q171とLine_Color_Q171の間で色の補間が行われています。

例えばこの793行目を次のようにFill_Color_Q171とLine_Color_Q171の順番を入れ替えると

 half4 Color_At_T_Q173 = lerp( Line_Color_Q171, Fill_Color_Q171, float4( inLine_Q168, inLine_Q168, inLine_Q168, inLine_Q168));

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

というようにFillColorとLineColorが入れ替わります。

以上がLineColorの働きになります。