イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

shader テクスチャバグSquare

 

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"
}