本日もMRTKのHandTrianglesShaderの勉強枠です。
前回ジオメトリシェーダーの扱いを学びHandTrianglesShaderのジオメトリシェーダーを読み解いています。
今回MRTKのHandTrianglesShaderのジオメトリシェーダーを読み解いていきます。 長いのでその② 序Ⅱです。
// 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に代入されています。
一気に難しくなってきました。 ひと段落付けたら具体的に値を入れて動きを見ていきます。