グリッチ - saitocastel1900/UnityShader GitHub Wiki
- step()で白と黒に分かれた色を作る。この時、白と黒に分ける色を二つ作るが、色と黒に分ける閾値は異なるものにする。その後、作った色の差分を取るとラインができる
- このライン(白色の部分)をもとにテクスチャを動かす
float Line1 = step(_LinePositionY , uv.y);
float Line2 = step(_LinePositionY + _LineWidth, uv.y);
uv.x += saturate(Line1-Line2);
return saturate(Line1-Line2);
- 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);
- 乱数と時間を使っていい感じにずらしてもらう
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);
- 動きが滑らかすぎてグリッチのようではないので、移動する間隔をポスタライズで落とす
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);
- このままだと左方向にしてスライドしないので、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);