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