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

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

shader マンデルブロ

f:id:arumogina:20190804073121p:plain

 

Shader "Custom/Mnd" {
	Properties{
		_MainTex("MainTex",2D) = "white"{}
		_P1("P1",Range(0,1)) = 1
	}
	SubShader{
		Tags{"RenderType"="Opaque" "Queue" = "Geometry"}
		//透明部分のあるテクスチャを使う場合
		//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;
			};

			float _P1;

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

			sampler2D _MainTex;

			float3 hsv(float h, float s, float v){
			    float4 t = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
			    float3 p = abs(frac(float3(h,h,h) + t.xyz) * 6.0 - float3(t.w,t.w,t.w));
			    return v * lerp(float3(t.x,t.x,t.x), clamp(p - float3(t.x,t.x,t.x), 0.0, 1.0), s);
			}

			float mod(float x, float y){
		  	return x - y * floor(x / y);
		  }

			float4 frag(v2f i) :SV_Target {
		    // マンデルブロ集合
				//http://yomotsu.net/blog/2014/03/31/fractal.html
				//http://azisava.sakura.ne.jp/mandelbrot/definition.html
		    int cnt = 0;                    // カウンタ
		    float2 z = float2(0.0, 0.0);  // 漸化式 Z の初期値
				float2 zNext = float2(0,0);		//zNext = z^2 + c
				float2 c = 2.0 * i.uv - 1.0;  //複素平面上の座標

		    // 漸化式の繰り返し処理(今回は 360 回ループ)
		    for(int i = 0; i < 360; i++){
					/*マンデルブロ集合を複素数を使わずに書き直す(原理不明だがwikipediaで説明がある)*/
					zNext = float2(z.x*z.x - z.y*z.y + c.x,  2*z.x*z.y + c.y);
					z = zNext;
		      if(length(z) > 2.0){break;}
					cnt++;
		    }

		    // 時間の経過で色を HSV 出力する
		    //float h = mod(_Time.y * 20.0, 360.0) / 360.0;
		    //float3 rgb = hsv(float(cnt)/360, 1.0, 1.0);
				//float3 rgb = hsv(float(cnt)/360, 1.0, 1.0);
				float m = float(cnt)/360.0;
				float3 rgb = float3(m,m*3,m*5);
		    return float4(rgb, 1.0);
			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}