6 円やリングを動かす
このシェーダー入門は、おもに数式に焦点をあてる。なぜかって?筆者が数学なんもわからんの民だからだ。まちがっていたらおしえてほしい。
この記事は 7日間でマスターするUnityシェーダ入門 を自分なりに理解しようと努めた内容だ。また、プログラムはここからの引用であることが多い。詳しく知りたかったら、原典を参照してほしい。
まず円を描く。distance
関数によってある点からの距離がわかるので、距離が一定より低い範囲の色を変える。
float dist = distance( fixed3(0,0,0), IN.worldPos );
float radius = 2;
if(radius < dist){
o.Albedo = fixed4(110/255.0, 87/255.0, 139/255.0, 1);
} else {
o.Albedo = fixed4(1,1,1,1);
}
条件式に手を加えることにより、円の輪郭線を描ける。
float dist = distance( fixed3(0,0,0), IN.worldPos );
float radius = 2;
-if(radius < dist){
+if(radius < dist && dist < radius + 0.2){
- o.Albedo = fixed4(110/255.0, 87/255.0, 139/255.0, 1);
+ o.Albedo = fixed4(1,1,1,1);
} else {
- o.Albedo = fixed4(1,1,1,1);
+ o.Albedo = fixed4(110/255.0, 87/255.0, 139/255.0, 1);
}
同心円状に円を繰り返す。sin 波を利用する。sin 波は正と負に振れる波なので、正だけに振れるように絶対値を取る。
これが、
こうなる。
実装はこうだ。
float dist = distance(fixed3(0,0,0), IN.worldPos);
float val = abs(sin(dist*3.0));
if(val > 0.98){
o.Albedo = fixed4(1, 1, 1, 1);
} else {
o.Albedo = fixed4(110/255.0, 87/255.0, 139/255.0, 1);
sin 関数への入力値から時間を引いて、sin 波を外側へ動かす。
float dist = distance(fixed3(0,0,0), IN.worldPos);
-float val = abs(sin(dist*3.0));
+float val = abs(sin(dist*3.0-_Time*100));
if(val > 0.98){
o.Albedo = fixed4(1, 1, 1, 1);
} else {
o.Albedo = fixed4(110/255.0, 87/255.0, 139/255.0, 1);
}