unity3d shader之Julia集和Mandelbrot集绘制美丽图案

在书上偶然看到Mandelbrot集的绘制方法,在网上查阅了一些资料,自己动手试了一下,终于“看到了”数学之美。

在百度百科上的简介

曼德勃罗特集是人类有史以来做出的最奇异,最瑰丽的几何图形.曾被称为“上帝的指纹”。 这个点集均出自公式:Zn+1=(Zn)^2+C,

这是一个迭代公式,式中的变量都是复数.这是一个大千世界,从他出发可以产生无穷无尽美丽图案,他是曼德勃罗特教授在二十世纪七十年代发现的.你看上图中,有的地方象日冕,有的地方象燃烧的火焰,只要你计算的点足够多,不管你把图案放大多少倍,都能显示出更加复杂的局部.这些局部既与整体不同,又有某种相似的地方,好像着梦幻般的图案具有无穷无尽的细节和自相似性.曼德勃罗特教授称此为"魔鬼的聚合物".为此,曼德勃罗特在1988年获得了"科学为艺术大奖"。

图形是由美国数学家曼徳勃罗特教授于1975年夏天一个寂静的夜晚,在冥思苦想之余翻看儿子的拉丁文字典是想到的,起拉丁文的原意是“产生无规则的碎片”

julia朱丽叶集与之相似

也是百度百科上的简介

朱利亚集合可以由下式进行反复迭代得到:

fc(z) = z2 + c

对于固定的复数c,取某一z值(如z = z0),可以得到序列

z0,fc(z0),fc(fc(z0)),fc(fc(fc(z0))),....

这一序列可能反散于无穷大或始终处于某一范围之内并收敛于某一值。我们将使其不扩散的z值的集合称为朱利亚集合

更详细的包括算法可以在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

时间: 2024-11-09 13:40:13

unity3d shader之Julia集和Mandelbrot集绘制美丽图案的相关文章

unity3d shader之Julia集和Mandelbrot集绘制美丽图案 (二)

之前写过一篇Mandelbrot集的代码在这里 这次主要写Julia集的 Mandelbrot 集内的每一个点都对应了一个连通的 Julia 集,Mandelbrot 集合外的点则对应了不连通的 Julia 集 Julia集合可以由下式进行反复迭代得到:f(z) = z^2 + c 这篇文章(www.matrix67.com/blog/archives/4570)讲的非常详细 迭代次数,C值均可调, 先来看看效果: 代码在此: Shader "Custom/julia1x" { Pro

广义mandelbrot集,使用python的matplotlib绘制,支持放大缩小

迭代公式的指数,使用的1+5j,这是个复数,所以是广义mandelbrot集,大家可以自行修改指数,得到其他图形.各种库安装不全的,自行想办法,可以在这个网站找到几乎所有的python库 http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib #encoding=utf-8 import numpy as np import pylab as pl import time from matplotlib import cm from math

【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&amp;颜色、光照与材质

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 本篇文章中,我们学习了Unity Shader的基本写法框架,以及学习了Shader中Properties(属性)的详细写法,光照.材质与颜色的具体写法.写了6个Shader作为本文S

【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 &amp; 第一个Shader的书写

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇,本文的第一部分为系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式,最后一部分讲解了如何在U

【译】Unity3D Shader 新手教程(1/6)

刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D Shader编程望而却步.该系列教程的第一篇文章(译者注:即本文,后续还有5篇文章)详细介绍了Unity3D中的表面着色器(Surface Shader)的,为学习更复杂的Shader编程打下基础. 动机 如果你是刚刚接触Shader编程的新手,你可能不知道从何开始踏出Shader编程的第一步.本教程将带你一步步完成一个表面着色器(Surface Shader)和片段着色器(Fra

【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 &amp; 纹理混合

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/41175585 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 本文介绍了Unity中子着色器.通道和标签相关的详细概念与写法,以及纹理的设置方法,基本的纹理混合写法,写了5个Shader作为本文Shader讲解的实战内容,最后创建了一个梦幻的光之

Unity3D shader简介

Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易.毫无疑问,shader(着色器)编码,仍有很长的路要走.shader是一个专门运行在GPU的程序,经常被神秘包围,它最终绘制3D模型的三角形.如果你想给游戏一个特殊的显示,学习如何编写shader是必要的.Unity3D使用shader做后期处理,对2D游戏也是必不可少的.这个系列的文章将逐步介绍shader编程,并面向几乎没有任何shader知识的开发者. 简介 下图大致表示了在Unity3D渲染流程中发

【浅墨Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/plus/view.php?aid=165 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文主要讲解了Unity中SurfaceShader的具体写法,以及几个常用的CG函数的用法. 在这里先说明一下,表面着色器将分为

【浅墨Unity3D Shader编程】之四 热带雨林篇: 剔除、深度测试、Alpha测试以及基本雾效合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/163.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文介绍了Unity中Shader书写中会用到的剔除.深度测试.Alpha测试以及基