夜風のMixedReality

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

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

本日もMRTKのHandTrianglesShaderの勉強枠です。

前回ジオメトリシェーダーの扱いを学びHandTrianglesShaderのジオメトリシェーダーを読み解いています。

今回MRTKのHandTrianglesShaderのジオメトリシェーダーを読み解いていきます。 長いのでその② 序Ⅱです。

redhologerbera.hatenablog.com

  // From_XY
        float2 Vec2_Q167 = float2(X_Q166,Y_Q166);

        float Result_Q150;
        Cell_Noise_2D_B150(Average_Q153,_Pulse_Noise_Frequency_,111,Result_Q150);

Vec2_Q167にPulse_Origin.xyの値が代入されます。

Cell_Noise_2D_B150

508~529行目に記述されています。

   void Cell_Noise_2D_B150(
        float2 XY,
        float Frequency,
        float Seed,
        out float Result    )
    {
        
        float2 P = XY * float2(Frequency,Frequency)+float2(Seed,Seed);
        float2 Pi = floor(P);
        
        Pi = mod289_Bid150(Pi); // To avoid truncation effects in permutation
        
        float2 ix = Pi.xy;
        float2 iy = Pi.yx;
        
        float2 i = permute_Bid150(permuteB_Bid150(ix) + iy);
        
        Result = frac(i.x*(1.0/41.0)+i.y*(1.0/42.0));
        
        //Result = lerp(Out_Min, Out_Max, r);
        
    }

・float2 XY=Average_Q153(=頂点ベクトルの平均ベクトル)

・float Frequency=Pulse_Noise_Frequency(Propertiesでデフォルトで777が指定されています。)

・float Seed=111

・out float Result=Result_Q150

というように代入されています。

      float2 P = XY * float2(Frequency,Frequency)+float2(Seed,Seed);

Average_Q150(=頂点ベクトルの平均ベクトル)にFrequencyを各成分にかけて各成分にSeed(=111)が加算されたものがPに代入されます。

        float2 Pi = floor(P);

PiはPの値の小数点を繰り下げしたものになります。(例; 5.99999 => 5.0 、-5.99999=>-6)

ここでmod289_Bid150(Pi)が代入されています。

Pi = mod289_Bid150(Pi); // To avoid truncation effects in permutation
    float2 mod289_Bid150(float2 x)
    {
      return x - floor(x * (1.0 / 289.0)) * 289.0;
    }

289はマジックナンバーになっていてよくわかりませんでしたが、289=1717 であり289/256のあまりが17になったりするので、何か意味がある数なのでしょう。

戻り値としてここではPiからPiを289で割った数の切り捨てしたものに289をかけています。

        float2 ix = Pi.xy;
        float2 iy = Pi.yx;
        
        float2 i = permute_Bid150(permuteB_Bid150(ix) + iy);

iにはpermute_Bid150(permuteB_Bid150(ix) + iy)が代入されています。

   float2 permute_Bid150(float2 x)
    {
      return mod289_Bid150(((x*float2(33.0,35.0))+1.0)*x);
    }

    float2 permuteB_Bid150(float2 x)
    {
      return mod289_Bid150(((x*float2(37.0,34.0))-1.0)*x);
    }

ここでpermuteB_Bid150(ix) + iyはix(=Pi.xy)に(37.0,34.0)をかけ-1.0を引いたものにさらにPi.xyをかけたものになります。

ここにも37,34のマジックナンバーが登場しています。

Result = frac(i.x*(1.0/41.0)+i.y*(1.0/42.0));

ResultはResult_Q150を指します。i.x=iのx成分を41で割ったものとiのy成分を42で割ったものを加算したものの小数部を返します。

〇 Cell_Noise_2D_B150()のまとめ

①Pはポリゴンの重心にFrequency(デフォルトで777)とSeed(=111)をかけたもの

②PiはPの少数部分を切り捨てしたもの

③ixはPiのx成分y成分、iyはPiのy成分x成分

④ixにfloat2(37.0,34.0)をかけ1を引き、さらにixをかけたものがpermuteB_Bid151(ix)で返される。

⑤iは④にiyを足したものにfloat2(33.0,35.0)をかけ、1を加算し④にiyを足したものをかけたもの

〇distance

 float Distance_Q159 = distance(Average_Q153,Vec2_Q167);

distance()は2点間の距離を求めるメソッドです。

Distance_Q159にはポリゴンの重心ベクトルと_Pulse_Originのベクトルの距離が代入されます。

   float Result_Q151;
        Cell_Noise_2D_B151(Average_Q153,_Pulse_Noise_Frequency_,333,Result_Q151);

Cell_Noise_2D_B151()は583~604行目に記述されています。

void Cell_Noise_2D_B151(
        float2 XY,
        float Frequency,
        float Seed,
        out float Result    )
    {
        float2 P = XY * float2(Frequency,Frequency)+float2(Seed,Seed);
        float2 Pi = floor(P);
        
        Pi = mod289_Bid151(Pi); // To avoid truncation effects in permutation
        
        float2 ix = Pi.xy;
        float2 iy = Pi.yx;
        float2 i = permute_Bid151(permuteB_Bid151(ix) + iy);
        Result = frac(i.x*(1.0/41.0)+i.y*(1.0/42.0));

        //Result = lerp(Out_Min, Out_Max, r);        
    }

・float2 XY=Average_Q153(=頂点ベクトルの平均ベクトル)

・float Frequency=Pulse_Noise_Frequency(Propertiesでデフォルトで777が指定されています。)

・float Seed=333

・out float Result=Result_Q151

というように代入されています。

ここはCell_Noise_2D_B150()と同様の処理がされています。最初のSeedのパラメーターのみが異なります。

Cell_Noise_2D_B150()同様ResultはResult_Q151が返されます。

〇ここまでのまとめ

 ①頂点シェーダーから受け取った頂点からポリゴンの重心ベクトルを求める。

 ②①にFrequencyを積算しSeedを加算した小数部切り捨てしたベクトルから派生したベクトルiのx成分、y成分を合成したものをResultとして返します。

 ③ポリゴンの重心ベクトルと_Pulse_Originのベクトルの距離をDistance_Q159に代入されています。

一気に難しくなってきました。 ひと段落付けたら具体的に値を入れて動きを見ていきます。