极致的数学之美!

什么是分形?

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

简单来说,分形(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 开发"分形着色器"的技术分享。更多精彩内容在公众号【白玉无冰】。有什么想法欢迎留言交流!如果这篇对你有点帮助,欢迎分享给身边的朋友。

分形的奥秘!分形着色器!shader 编程入门实战 ! Cocos Creator!的更多相关文章

  1. Unity3D着色器Shader编程入门(一)

    自学Unity3D也有大半年了,对Shader一直不敢入坑,最近看了些资料,以及通过自己的实践,对Shader还是有一点了解了,分享下仅作入门参考. 因Shader是对图像图像渲染的,学习前可以去了解 ...

  2. 着色器(Shader)

    着色器(Shader) 顶点着色器(Vertex shader) 片段着色器(Fragment shader) 几何着色器(Geometry Shader) 提供通用计算能力的着色器(Compute ...

  3. shader 编程入门(一)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  4. 着色器语言GLSL入门

    着色器语言 GLSL (opengl-shader-language)入门大全 -- 转载自: https://github.com/wshxbqq/GLSL-Card

  5. WebGL着色器渲染小游戏实战

    项目起因 经过对 GLSL 的了解,以及 shadertoy 上各种项目的洗礼,现在开发简单交互图形应该不是一个怎么困难的问题了.下面开始来对一些已有业务逻辑的项目做GLSL渲染器替换开发. 起因是看 ...

  6. Java 简单的 socket 编程入门实战

    这个是给女朋友写的:) 首先需要知道我们每个电脑都可以成为server(服务器) 和 client(客户端) 我们需要使用java来实现客户端与服务器的数据传输 先帖上代码 注意这里两张代码处于两个j ...

  7. OpenGL之shader着色器的应用,三色渐变的三角形

    学习自: https://learnopengl-cn.github.io/01%20Getting%20started/05%20Shaders/#_7 首先放一张效果图: 本次教程,将着色器单独定 ...

  8. DirectX11--深入理解Effects11、使用着色器反射机制(Shader Reflection)实现一个复杂Effects框架

    前言 如果之前你是跟随本教程系列学习的话,应该能够初步了解Effects11(现FX11)的实现机制,并且可以编写一个简易的特效管理框架,但是随着特效种类的增多,要管理的着色器.资源等也随之变多.如果 ...

  9. Turing渲染着色器网格技术分析

    Turing渲染着色器网格技术分析 图灵体系结构通过使用 网格着色器 引入了一种新的可编程几何着色管道.新的着色器将计算编程模型引入到图形管道中,因为协同使用线程在芯片上直接生成紧凑网格( meshl ...

随机推荐

  1. spring cloud的配置

    注解篇 @EnableEurekaServer 注解启动一个服务注册中心提供给其他应用进行对话 @EnableDiscoveryClient 激活Eureka中的DiscoveryClient实现 配 ...

  2. 获取各类前几名数据的MYSQL写法

    前几天,某在培训的朋友问我一个问题:查询每门功课成绩最好的前两名该怎么写. 这个问题虽然听起来挺简单,但是很有意思,于是我就新建了一张如下的表: stuNo为学号,stuScore为分数,course ...

  3. 基于python的感知机

    一. 1.感知机可以描述为一个线性方程,用python的伪代码可表示为: sum(weight_i * x_i) + bias -> activation #activation表示激活函数,x ...

  4. set(待整理)

    set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...

  5. GitHub 上这几个沙雕项目,够我玩几天

    在家里都憋坏了吧?每天睡了吃吃了睡,该找点事做做了,今天推荐几个好(沙)玩(雕)的开源项目,好在家打发时间. 91 吴先生 一个在线的 PornHub 风格 Logo 生成工具 Logoly.Pro ...

  6. 异想家Ubuntu安装的软件

    [替换国内源] https://developer.aliyun.com/mirror/ubuntu 我提供一个下载,方便第一次安装懒得敲命令: https://jfz.me/16.04/source ...

  7. object-c中的int NSInteger NSUInteger NSNumber辨析

    object-c中的int NSInteger NSUInteger NSNumber辨析 #import <Foundation/Foundation.h> int main(int a ...

  8. Object-c的字符串处理常用方法

    Object-c的字符串处理常用方法 #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...

  9. a标签跳转小程序

    随着小程序应用的逐步广泛,与公众号之前的协同运营越来越重要,通过公众号的各个入口为小程序导流.最近在运营中发现,大家对公众号关注后回复.关键词回复,超链接小程序的需求.        首先把小程序绑定 ...

  10. 【Kafka 源码解读】之 【代码没报错但是消息却发送失败!】

    聊聊最近,2020年,在2019年的年尾时,大家可谓对这年充满新希望,特别是有20200202这一天.可是澳洲长达几个月的大火,新型冠状病毒nCoV的发现,科比的去世等等事情,让大家感到相当的无奈,生 ...