极致的数学之美!

什么是分形?

“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”

简单来说,分形(fractal)就像这个doge表情包一样,放大一部分后和原来的图近似。

用分形着色器实现的效果如下,在编辑器内放大其中的一部分,会发现与整体非常相似!

如何实现这么优雅的图片?一切起源于简单的公式(julia set)

f(n) = f(n-1) * f(n-1) + c

通过迭代 n 次后可以实现分形效果。

起始值 f(0) 如何确定? 可以通过纹理坐标来确定。

当然这个起始值是个复数,有实数部分和虚数部分。我们用纹理u坐标表示实数,v表示虚数部分。

纹理坐标的取值是0-1,可以加一些偏移和缩放处理。

float real = (v_uv0.x-0.5)/zoom + offset.x;
float image = (v_uv0.y-0.5)/zoom + offset.y;

c 也是复数,对于不同的值,效果也不一样。

一次迭代如何计算?记得虚数部分 i*i = -1 就可以根据公式计算了,参考代码如下:

float tmp_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)i
real = (tmp_real*tmp_real) - (image*image) + c_real;
// 虚数部分
image = 2.0*tmp_real*image + c_image;

如何显示不同的颜色?当迭代到一定次数后,这个迭代函数会发散。当这个复数的模大于2时,停止迭代,并根据次数显示不同的颜色。

for(float i = 0.0; i < 9999.0; i++){
// 计算新的复数... 省略部分代码 // 复数大小的平方
r2 = real*real + image*image;
conut = i;
if(r2 >= 4.0){
break;
}
}
if(r2 < 4.0){
o = v_color;
}else{
o = vec4(mix(outColor1.rgb, outColor2.rgb, fract(conut*0.07)), 1);
}

这里用到了一些内置函数,不清楚的话可以看下图。

如果我们对公式中的 c 修改一下,让它与起始值相同,就变成了 mandelbrot set

float real = (v_uv0.x-0.5)/zoom + offset.x;
float image = (v_uv0.y-0.5)/zoom + offset.y;
float c_real = real;
float c_image = image;

这幅图被称作上帝的指纹

以上为白玉无冰使用 Cocos Creator v2.2.2 开发"分形着色器"的技术分享。更多精彩内容在公众号【白玉无冰】。有什么想法欢迎留言交流!如果这篇对你有点帮助,欢迎分享给身边的朋友。

最新文章

  1. 复利计算器(软件工程)及Junit测试———郭志豪
  2. 优化MySchool数据库设计之【巅峰对决】
  3. Java基础复习笔记系列 七 IO操作
  4. 相识从C语言开始
  5. C# String.Format大全 去 decimal 后面的 0
  6. Android开发-Hello World+phonegap(Cordova)
  7. HttpClient(4.3.5) - Exception Handling
  8. hihoCoder 1391 Countries 【预处理+排序+堆】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)
  9. linux中切换用户方式su和su -的区别
  10. js字母大小写转换
  11. kindeditor使用方法
  12. VBS脚本合集(自制脚本)
  13. springMVC在普通方法中调用service方法
  14. Linux下如果忘记了Mysql的root密码该怎么办?
  15. Word2016“此功能看似已中断 并需要修复”问题解决办法
  16. form表单里的故事
  17. BeanUtils 读取数据
  18. day08-(xml&amp;&amp;tomcat)
  19. GameObject.Find与Transform.Find的区别
  20. Miller_Rabbin算法判断大素数,Pollard_rho算法进行质因素分解

热门文章

  1. axios请求方法封装.
  2. Python3之MySQL操作
  3. zookeeper3.4.6安装
  4. PYTHON经典算法-二叉树的后序遍历
  5. 最短路径-Dijkstra+Floyd+Spfa
  6. B语言的发明者 Ken Thomson &amp; C语言的发明者Dennis Ritchie
  7. MyBatis 介绍
  8. Java入门基础(类)
  9. WeChall_Training: Get Sourced (Training)
  10. Multi-hierarchical Independent Correlation Filters for Visual Tracking(MFT)略读