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

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

shader volonoi

 

f:id:arumogina:20190827010604p:plain

Shader "Custom/Volonoi" {
	Properties{
		_Split("Split",Int) = 5
		_P("P",Float) = 0
		_RDM("RDM",Float) = 4
		_SPD("SPD",Float) = 1
		_Color("Color",Color) = (0,0,0,1)
		_Color2("Color2",Color) = (0,0,0,1)
	}
	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;
			};

			int _Split;
			float _P;
			float _RDM;
			float _SPD;
			float4 _Color;
			float4 _Color2;

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

			float2 rand2(float2 st){
					 st = float2(dot(st, float2(127.1, 311.7)),
											 dot(st, float2(269.5, 183.3)));
					 return frac(sin(st) * 43758.5453123);
			 }

			v2f vert(appdata v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}

			float dist = 100;
			float4 frag(v2f i) :SV_Target {
				float2 auv = i.uv*_Split;
				float2 uv = frac(auv);
				float2 id = floor(auv);
				float min_dist = 100;
				float2 min_p = float2(0,0);
				//各マスのランダムな位置に頂点を配置
				//周囲8マスと現在のマスに配置されたランダムな頂点を探索し
				//処理対象のピクセルと最も近い点を探す
				for(int k=-1;k<=1;k++){
					for(int m=-1;m<=1;m++){
						float2 km = float2(k,m);
						float2 rand_p = rand2(id+km);
						//各マスの中心位置(0.5,0.5)から各成分+0.5までの移動を許している
						rand_p = float2(0.5,0.5)+0.5*sin(_Time.y*_SPD+_RDM*rand_p);
						float dist = length(rand_p+km-uv);
						if(dist<min_dist){
							min_dist = dist;
							min_p = rand_p;
						}

					}
				}

				float4 col = _Color + min_dist*2;
				col.rg = min_p;
				//col -= abs(sin(80*min_dist))*0.07; //縞模様
				//col += 1-step(0.02,min_dist); //中央の点
				return float4(col.rgb,1);

				//return float4(dist,dist,0,1);
				//return clamp(_Color,_Color2,dist);
				//return lerp(_Color,_Color2,dist);
			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}
Shader "Custom/Base" {
	Properties{
		_Split("Split",Int) = 5
	}
	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;
			};

			int _Split;

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

			v2f vert(appdata v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}

			float4 frag(v2f i) :SV_Target {
				float2 auv = i.uv*_Split;
				float2 uv = frac(auv);
				float2 id = floor(auv);
				float2 rp = float2(rand(id.xy+1),rand(float2(id.x,id.y)));
				float len = length(rp-uv);
				return float4(len,0,0,1);


			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}

Shader "Custom/Base" {
	Properties{
		_Split("Split",Int) = 5
		_P("P",Float) = 0
		_RDM("RDM",Float) = 4
		_SPD("SPD",Float) = 1
		_Color("Color",Color) = (0,0,0,1)
		_Color2("Color2",Color) = (0,0,0,1)
	}
	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;
			};

			int _Split;
			float _P;
			float _RDM;
			float _SPD;
			float4 _Color;
			float4 _Color2;

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

			float2 rand2(float2 st){
					 st = float2(dot(st, float2(127.1, 311.7)),
											 dot(st, float2(269.5, 183.3)));
					 return frac(sin(st) * 43758.5453123);
			 }

			v2f vert(appdata v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}

			float dist = 100;
			float4 frag(v2f i) :SV_Target {
				float2 auv = i.uv*_Split;
				float2 uv = frac(auv);
				float2 id = floor(auv);
				float min_dist = 100;
				float2 min_p = float2(0,0);
				//各マスのランダムな位置に頂点を配置
				//周囲8マスと現在のマスに配置されたランダムな頂点を探索し
				//処理対象のピクセルと最も近い点を探す
				for(int k=-1;k<=1;k++){
					for(int m=-1;m<=1;m++){
						float2 km = float2(k,m);
						float2 rand_p = rand2(id+km);
						//各マスの中心位置(0.5,0.5)から各成分+0.5までの移動を許している
						rand_p = float2(0.5,0.5)+0.5*sin(_Time.y*_SPD+_RDM*rand_p);
						float dist = length(rand_p+km-uv);
						if(dist<min_dist){
							min_dist = dist;
							min_p = rand_p;
						}

					}
				}

        fixed4 col = min_dist;
				//グレースケール
				//col = dot(min_p, float2(0.3, 0.6));
				//カラー
				col = min_dist * 0.1;
				col.rg += min_p;
				//col -= abs(sin(10*min_dist+_Time.y*_SPD))*0.7;
				col -= step(0.2,abs(sin(10*min_dist+_Time.y*_SPD))*0.7);
				//col += 1-step(0.5,min_dist);
				col.a = 1;
        return col;
				/*
				float4 col = _Color + min_dist*2;
				col.rg = min_p;
				col -= abs(sin(80*min_dist))*0.07;
				col += 1-step(0.02,min_dist);
				return float4(col.rgb,1);
				*/
				//return float4(dist,dist,0,1);
				//return clamp(_Color,_Color2,dist);
				//return lerp(_Color,_Color2,dist);
			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}

Shader "Custom/Volonoi" {
	Properties{
		_Split("Split",Int) = 5
		_P("P",Float) = 0
		_RDM("RDM",Float) = 4
		_SPD("SPD",Float) = 1
		_Color("Color",Color) = (0,0,0,1)
		_Color2("Color2",Color) = (0,0,0,1)
	}
	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;
			};

			int _Split;
			float _P;
			float _RDM;
			float _SPD;
			float4 _Color;
			float4 _Color2;

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

			float2 rand2(float2 st){
					 st = float2(dot(st, float2(127.1, 311.7)),
											 dot(st, float2(269.5, 183.3)));
					 return frac(sin(st) * 43758.5453123);
			 }

			v2f vert(appdata v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}

			float dist = 100;
			float4 frag(v2f i) :SV_Target {
				float2 auv = i.uv*_Split;
				float2 uv = frac(auv);
				float2 id = floor(auv);
				float m_dist[5] = {9,9,9,9,9};//距離が小さい順に先頭から入れる
				float2 m_p[5];//同じインデックスに対応する座標を入れる
				//各マスのランダムな位置に頂点を配置
				//周囲8マスと現在のマスに配置されたランダムな頂点を探索し
				//処理対象のピクセルと最も近い点を探す
				for(int k=-1;k<=1;k++){
					for(int m=-1;m<=1;m++){
						float2 km = float2(k,m);
						float2 rand_p = rand2(id+km);
						//各マスの中心位置(0.5,0.5)から各成分+0.5までの移動を許している
						rand_p = float2(0.5,0.5)+0.5*sin(_Time.y*_SPD+_RDM*rand_p);
						float dist = length(rand_p+km-uv);
						for(int n=0;n<5;n++){
							if(dist<m_dist[n]){
								[unroll]
								for(int o=4;o>n;o--){
									m_dist[o] = m_dist[o-1];
									m_p[o] = m_p[o-1];
								}
								m_dist[n] = dist;
								m_p[n] = rand_p;
								break;
							}
						}
					}
				}
				//float md = m_dist[0]*m_dist[1]*m_dist[2]*m_dist[3]*m_dist[4];
				//float2 mp = m_p[0]*m_p[1]*m_p[2]*m_p[3]*m_p[4];
				float md = m_dist[4]-m_dist[3]+m_dist[2]-m_dist[1]+m_dist[0];
				float2 mp = m_p[0]/m_p[1]*m_p[2]/m_p[1]*m_p[0];
				float4 col = _Color + md*2;
				col.rg = mp;
				//col -= abs(sin(80*md))*0.07; //縞模様
				//col += 1-step(0.3,md); //中央の点
				return float4(col.rgb,1);

				//return float4(dist,dist,0,1);
				//return clamp(_Color,_Color2,dist);
				//return lerp(_Color,_Color2,dist);
			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}

Shader "Custom/Base" {
	Properties{
		_Split("Split",Int) = 5
		_P("P",Float) = 0
		_RDM("RDM",Float) = 4
		_SPD("SPD",Float) = 1
		_Color("Color",Color) = (0,0,0,1)
		_Color2("Color2",Color) = (0,0,0,1)
	}
	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;
			};

			int _Split;
			float _P;
			float _RDM;
			float _SPD;
			float4 _Color;
			float4 _Color2;

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

			float2 rand2(float2 st){
					 st = float2(dot(st, float2(127.1, 311.7)),
											 dot(st, float2(269.5, 183.3)));
					 return frac(sin(st) * 43758.5453123);
			 }

			v2f vert(appdata v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}

			float dist = 100;
			float4 frag(v2f i) :SV_Target {
				float2 auv = i.uv*_Split;
				float2 uv = frac(auv);
				float2 id = floor(auv);
				float dist = 100;
				//各マスのランダムな位置に頂点を配置
				//周囲8マスと現在のマスに配置されたランダムな頂点を探索し
				//処理対象のピクセルと最も近い点を探す
				for(int k=-1;k<=1;k++){
					for(int m=-1;m<=1;m++){
						float2 km = float2(k,m);
						float2 rand_p = rand2(id+km);
						//各マスの中心位置(0.5,0.5)から各成分+0.5までの移動を許している
						rand_p = float2(0.5,0.5)+0.5*sin(_Time.y*_SPD+_RDM*rand_p);
						dist = min(dist,length(rand_p+km-uv));
					}
				}
				//return float4(dist,dist,0,1);
				//return clamp(_Color,_Color2,dist);
				return lerp(_Color,_Color2,dist);
			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}