极致的数学之美!什么是分形?“一个粗略或零碎的几何形状,可以分成几个部分,每个部分(至少近似地)是整体的缩小形状。”简单来说,分形就像这个dogememe,将一部分放大后接近原图。用分形着色器实现的效果如下,如果你在编辑器中放大其中的一部分,你会发现它和整体非常相似!如何实现如此优雅的画面?一切都从一个简单的公式(julia集)开始。f(n)=f(n-1)*f(n-1)+c迭代n次后可以达到分形效果。起始值f(0)是如何确定的?可以通过纹理坐标来确定。当然,这个初值是一个有实部和虚部的复数。我们使用纹理u坐标表示实数,v表示虚部。纹理坐标的取值范围是0-1,可以加上一些偏移和缩放。floatreal=(v_uv0.x-0.5)/zoom+offset.x;floatimage=(v_uv0.y-0.5)/zoom+offset.y;c也是一个复数,不同的值效果不同。如何计算迭代次数?记住虚部i*i=-1可以根据公式计算出来,参考代码如下:floattmp_real=real;//计算新的复数-实部//f(n+1)=f(n)*f(n)+c//(a+bi)*(a+bi)+c=a*a-b*b+(2*a*b)i+c_real+(c_image)ireal=(tmp_real*tmp_real)-(image*image)+c_real;//虚部image=2.0*tmp_real*image+c_image;如何显示不同的颜色?经过一定次数的迭代后,迭代函数发散。当这个复数的模大于2时,停止迭代,根据次数显示不同的颜色。for(floati=0.0;i<9999.0;i++){//计算新的复数...省略一些代码//复数大小的平方r2=real*real+image*image;椰子=我;如果(r2>=4.0){中断;}}if(r2<4.0){o=v_color;}else{o=vec4(mix(outColor1.rgb,outColor2.rgb,fract(conut*0.07)),1);}这里有一些内置函数,不清楚的可以看下图。如果我们将公式中的c修改为与起始值相同,就变成了mandelbrot集。floatreal=(v_uv0.x-0.5)/zoom+offset.x;浮动图像=(v_uv0.y-0.5)/zoom+offset.y;浮动c_real=真实;浮动c_image=图像;这张照片被称为上帝的指纹。以上是白玉无冰使用CocosCreatorv2.2.2开发“分形着色器”的技术分享。更多精彩内容在公众号【白玉无冰】。如果您有什么想法,欢迎留言交流!如果本文对您有帮助,请分享给您的朋友。
