之前写过一篇Mandelbrot集的代码在这里
这次主要写Julia集的
Mandelbrot 集内的每一个点都对应了一个连通的 Julia 集,Mandelbrot 集合外的点则对应了不连通的 Julia 集
Julia集合可以由下式进行反复迭代得到:f(z) = z^2 + c
这篇文章(www.matrix67.com/blog/archives/4570)讲的非常详细
迭代次数,C值均可调, 先来看看效果:
代码在此:
Shader "Custom/julia1x" { Properties { _MainTex ("Noise", 2D) = "white" {} _MaxIters("Max Iters", range(0,85)) = 1//迭代次数 _CR("CR", range(-1,1)) = -0.7//y的C _CI("CI", range(-1,1)) = -0.7//x的C _TS("TS", range(0,15)) = 1//x缩放 _CS("CS", range(0,15)) = 1//y缩放 _S0("S0", range(-3,3)) = 0.5//x偏移 _T0("T0", range(-3,3)) = 0.5//y偏移 _Limits("iLimits", range(0,19)) = 5 _ConColor("ConColor",color)=(1,1,1,1) _DivColor1("Diverge Color1",color)=(1,1,1,1) _DivColor2("Diverge Color2",color)=(1,1,1,1) } SubShader { pass{ Tags{"LightMode"="ForwardBase" } Cull off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float4 _LightColor0; int _MaxIters; float _TS; float _CS; float _S0; float _T0; float _Limits; float _CR; float _CI; float4 _ConColor; float4 _DivColor1; float4 _DivColor2; float4 _MainTex_ST; struct v2f { float4 pos:SV_POSITION; float2 uv_MainTex:TEXCOORD0; }; v2f vert (appdata_full v) { v2f o; o.pos=mul(UNITY_MATRIX_MVP,v.vertex); o.uv_MainTex = TRANSFORM_TEX(v.texcoord,_MainTex); return o; } float4 frag(v2f i):COLOR { float real = i.uv_MainTex.x * _TS + _S0;//x float imag = i.uv_MainTex.y * _CS + _T0;//y float newr; int numIters; float4 color = 0; for(numIters = 0;numIters < _MaxIters;numIters++) { float newreal = real * real; float newimag = imag * imag; newr = newreal + newimag; if(newr >= _Limits) break; imag = real * imag * 2; real = newreal - newimag; real += _CR; imag += _CI; } if(newr<_Limits) color = _ConColor; if(newr>_Limits) color = lerp(_DivColor1,_DivColor2, frac(numIters/_CS)); return color; } ENDCG }// } }