グリッチ - saitocastel1900/UnityShader GitHub Wiki

  • uv座標を横にランダムに動かすことで再現する
  1. step()で白と黒に分かれた色を作る。この時、白と黒に分ける色を二つ作るが、色と黒に分ける閾値は異なるものにする。その後、作った色の差分を取るとラインができる
  • このライン(白色の部分)をもとにテクスチャを動かす
 float Line1 = step(_LinePositionY , uv.y);
                float Line2 = step(_LinePositionY + _LineWidth, uv.y);
                uv.x += saturate(Line1-Line2);
                return saturate(Line1-Line2);
  1. uv座標に作ったラインを足す。しかし、このまま足すとテクスチャが画面外に入ってしまうので、いい感じに調整する(白は値にすると1なので、uvが追加で横に1移動するが、uvは(0,0)~(1,1)の範囲しか値を取らないので、画面外にいってしまう)
  • テクスチャの一部をずらす
 float Line1 = step(_LinePositionY , uv.y);
                float Line2 = step(_LinePositionY + _LineWidth, uv.y);
                uv.x += saturate(Line1-Line2) * _Deviation;
                return tex2D(_MainTex,uv);
  1. 乱数と時間を使っていい感じにずらしてもらう
   float Line1 = step(_LinePositionY * rand(sin(_Time.w)), uv.y);
                float Line2 = step(_LinePositionY * rand(sin(_Time.w)) + _LineWidth, uv.y);
                uv.x += saturate(Line1-Line2) * _Deviation;
                return tex2D(_MainTex,uv);
  1. 動きが滑らかすぎてグリッチのようではないので、移動する間隔をポスタライズで落とす
float2 uv = i.uv;
                float Line1 = step(_LinePositionY * rand(sin(posterize(_Time.w))), uv.y);
                float Line2 = step(_LinePositionY * rand(sin(posterize(_Time.w))) + _LineWidth, uv.y);
                uv.x += saturate(Line1-Line2) * _Deviation;
                return tex2D(_MainTex,uv);
  1. このままだと左方向にしてスライドしないので、sin()を使って左右どちらにも移動してもらう
float2 uv = i.uv;
                float Line1 = step(_LinePositionY * rand(sin(posterize(_Time.w))), uv.y);
                float Line2 = step(_LinePositionY * rand(sin(posterize(_Time.w))) + _LineWidth, uv.y);
                uv.x += saturate(Line1-Line2) * _Deviation * sin(posterize(_Time.w) * _FrameRate);
                return tex2D(_MainTex,uv);