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

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

Shader NoData風

 

Shader "Custom/NoData3" {
	Properties{
		_XColor("XColor",Color) = (1,1,1,1)
		_XCLimit("XCLimit",Range(0,9)) = 1
		_YColor("YColor",Color) = (0.8,0.8,0.8,1)
		_YCLimit("XCLimit",Range(0,9)) = 5
		_ZColor("ZColor",Color) = (0.5,0.5,0.5,1)
		_TColor("TColor",Color) = (0.1,0.,0.,1)
		_MainTex("MainTex",2D) = "white"{}
		_DefaultSpeed("DefaultSpeed",Range(0,20)) = 5
		_PosSpeed("PosSpeed",Range(1,50)) = 10
		_NdPos("_NdPos",Range(0,1)) = 0.5
		_Wide("_Wide",Range(1,10)) = 4
	}
	SubShader{
		Tags {"Queue"="Transparent" "RenderType"="Transparent"}

		Blend SrcAlpha OneMinusSrcAlpha
		Pass{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct appdata {
				float4 vertex:POSITION;
				float4 uv:TEXCOORD0;
			};

			struct v2f {
				float4 pos:SV_POSITION;
				float4 uv:TEXCOORD0;
				float2 vpos:TEXCOORD1;
			};

			sampler2D _MainTex;
			float4 _XColor;
			float _XCLimit;
			float4 _YColor;
			float _YCLimit;
			float4 _ZColor;
			float4 _TColor;
			float _PosSpeed;
			float _DefaultSpeed;
			float _NdPos;
			float _Wide;
			v2f vert(appdata v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.vpos   = (o.pos.xy / o.pos.w) * 0.5 + 0.5;
				o.uv = v.uv;
				return o;
			}

			float rand(float2 co){
    		return frac(sin(dot(co.xy ,float2(12.9898,78.233))) * 43758.5453);
			}

			float4 GetDefaultColor(v2f i){
				float r = (i.pos.y + _Time.y*_DefaultSpeed) % 10;
				if(r<=_XCLimit) return _XColor;
				if(r<=_YCLimit) return _YColor;
				return _ZColor;
			}

			float4 XLineNoise(float from,float to,v2f i,float4 use){
				if(i.vpos.y>=from && i.vpos.y<=to){
					float s1 = floor(i.uv.y*100)%10/100;
					float ori_t = _Time.y;
					int t1 = ori_t%10;//整数部の1桁目を取得
					int t2 = floor(ori_t/10)%10;//整数部の2桁目を取得
					float s2 = rand(float2(t1,t2))*100%10/100;
					//float s2 = rand(float2(_Time.x,_Time.y))*100%10/100;
					//_NdPosを上手く設定すると、X軸上で表示される場所とされない場所を作ることが出来る。
					//_NdPos+s1+s1: _NdPos~_Ndpos+0.2の値にしている
					if(i.uv.x < _NdPos+s1+s2) use = _TColor;
				}
				return use;
			}

			float4 GetNoisedColor(v2f i,float4 use){
				float t = floor(_Time.y*_PosSpeed);//スピード
				float temp = t;
				int d[3];
				for(int k=0;k<3;k++){
					d[k] = temp%10;
					temp = floor(temp/10);//切り捨て除算
				}
				float r1 = rand(float2(d[0]+d[2],d[1]+d[2]));
				float r2 = r1+rand(d[0]+d[1]+d[2])/_Wide;//明るくする部分の幅
				use = XLineNoise(r1,r2,i,use);
				float r3 = rand(float2(d[0]+d[1],d[0]+d[2]));
				float r4 = r3+rand(d[0]+d[1]+0.2)/_Wide;
				use = XLineNoise(r3,r4,i,use);
				return use;
			}


			float4 frag(v2f i) :SV_Target {
				float4 c = tex2D(_MainTex,i.uv);
				float4 use = GetDefaultColor(i);
				return c*GetNoisedColor(i,use);
			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}