— 光属性のアルモジナ(VRChat勢) (@arumogina) June 23, 2019
Shader "Custom/TexBugSquare" { Properties{ _MainTex("MainTex",2D) = "white"{} _Height("Height",float) = 1.8//アバターの足裏をゼロとした場合の頭頂部の位置、つまり身長 _Width("Width",float) = 0.3//アバターの中心からの横幅 _Digit("Digit",Range(1,10)) = 1 _ChangeFrec("ChangeFrec",Range(1,500)) = 10 //バグ発生個所の変更頻度 _MaxBoxSize("MaxBoxSize",Range(0,0.1)) = 0.05 _MaxNoiseLen("MaxNoiseLen",Range(0,0.5)) = 0.1 _BugMacroNum("BugMacroNum",Range(1,10)) = 10 _BugMicroNum("BugMicroNum",Range(1,50)) = 5 _BugLineColor("BugLineColor",Color) = (1,0,0,1) _BugLineWidth("BugLineWidth",Range(0,0.01)) = 0.01 _BugSpd("BugSpd",Range(1,10)) = 3 } SubShader{ Tags{"RenderType"="Opaque" "DisableBatching"="true"} //透明部分のあるテクスチャを使う場合 //Tags{"Queue" = "Transparent" "RenderType" = "Transparent"} //Blend SrcAlpha OneMinusSrcAlpha Pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "ParinNoise.cginc" struct appdata { float4 vertex:POSITION; float4 uv:TEXCOORD0; }; struct v2f { float4 pos:SV_POSITION; float4 uv:TEXCOORD0; float4 lpos:TEXCOORD1; }; float _PI = 3.141592; sampler2D _MainTex; float _Height; float _Width; float _Digit; float _ChangeFrec; float _MaxBoxSize; float _MaxNoiseLen; int _BugMicroNum; float4 _BugLineColor; float _BugLineWidth; float _BugSpd; float _BugMacroNum; v2f vert(appdata v){ v2f o; o.lpos = v.vertex; o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } //0~1を返す float rand(float2 co){ return frac(sin(dot(co.xy ,float2(12.9898,78.233))) * 43758.5453); } float noise(float2 xy){ return frac(sin(dot(xy, float2(1000, 1000))) * 2000); } float NormalizeX(float x){ return x/_Width; } //-1~1に float NormalizeY(float y){ return y/_Height; } float Pow(float val,int times){ float res = 1; for(int k=0;k<times;k++){ res *= val; } return res; } float GetNumByTime(float digit,float change_frec){ int d = trunc(digit); float tm = _Time.y/change_frec*Pow(10,d); float mx = trunc(tm);//小数部3桁を整数部に移動 return frac(mx/10000);//整数部5桁を小数部に移動しそれのみxに代入 } //-1~1の値を取る float2 BugCenterPos(float av){ float x = rand(GetNumByTime(_Digit,_ChangeFrec)+av); float y = rand(float2(x,x)); x = (x - 0.5)*2; y = (y - 0.5)*2; //return float2(0,0); return float2(x,y); } //箱の距離関数 float rectangle(float2 p, float2 size){ return max(abs(p.x) - size.x/_Width, abs(p.y) - size.y/_Height); } float4 frag(v2f i) :SV_Target { float nx = NormalizeX(i.lpos.x); float ny = NormalizeY(i.lpos.y); int BN = trunc(_BugMacroNum); for(int j=0;j<trunc(BN);j++){ float2 o_cpos = BugCenterPos(rand(j)); float time = GetNumByTime(_Digit,_ChangeFrec/_BugSpd); //[unroll(30)]//unroll内の数値は_BugMicroNumに合わせて置き換える for(int k=0;k<_BugMicroNum;k++){ float2 cpos = o_cpos; int f = k - k % 2; cpos.x = o_cpos.x + (noise(float2(rand(f+0.1+time),rand(f+0.2+time)))-0.5)*2*_MaxNoiseLen/_Width; cpos.y = o_cpos.y + (noise(float2(rand(f+0.3+time),rand(f+0.4+time)))-0.5)*2*_MaxNoiseLen/_Height; float mx = abs(rand(f+0.5+time) - rand(f+0.6+time))*_MaxBoxSize; float ActBoxSizeX = _MaxBoxSize - mx; float my = abs(rand(f+0.7+time) - rand(f+0.8+time))*_MaxBoxSize; float ActBoxSizeY = _MaxBoxSize - my; float2 p = float2(cpos.x-nx,cpos.y-ny); float leng; leng = rectangle(p,float2(ActBoxSizeX,ActBoxSizeY)); if(leng<0.00001) clip(-1); leng = rectangle(p,float2(ActBoxSizeX+_BugLineWidth,ActBoxSizeY+_BugLineWidth)); if(leng<0.00001) return _BugLineColor; } } return tex2D(_MainTex,i.uv); //clip(-1); } ENDCG }//Pass }//SubShader FallBack "Diffuse" }