在书上偶然看到Mandelbrot集的绘制方法,在网上查阅了一些资料,自己动手试了一下,终于“看到了”数学之美。
在百度百科上的简介
也是百度百科上的简介
更详细的包括算法可以在wiki百科上看链接在这里
先来看看效果
颜色调得不太好,但是也可以看到精致的美丽。
就是在unity的shader中实现
Mandelbrot集的代码如下,julia集就由各位看官自己练习实现:
Shader "Custom/mandelbrot" {
Properties {
_MainTex ("Noise", 2D) = "white" {}
_MaxIters("Max Iters", range(0,185)) = 1//迭代次数
_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;
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;
float imag = i.uv_MainTex.y * _CS + _T0;
float real0 = real;
float imag0 = imag;
float newr;
int numIters;
float4 color = 0;
for(numIters = 0;numIters < _MaxIters;numIters++)
{
float newreal = real0 + real * real - imag*imag;
float newimag = imag0 + 2* real* imag;
newr = newreal * newreal + newimag * newimag;
if(newr >= _Limits)
break;
real = newreal;
imag = newimag;
}
if(newr<_Limits)
color = _ConColor;
if(newr>_Limits)
color = lerp(_DivColor1,_DivColor2, frac(numIters/_CS));
// color = float4(frac(numIters/_CS),0,0,1);//lerp(_DivColor1,_DivColor2, frac(numIters/_CS));
return color;
}
ENDCG
}//
}
}
----------------by wolf96 http://blog.csdn.net/wolf96
unity3d shader之Julia集和Mandelbrot集绘制美丽图案
原文地址:http://blog.csdn.net/wolf96/article/details/43703437