找回密码
 注册帐号

扫一扫,访问微社区

Unity教程 如何用shader模拟细胞自动机(Cellular automata)【含源码及视频教程】

99
回复
13163
查看
  [ 复制链接 ]
排名
10342
昨日变化

5

主题

54

帖子

334

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
173275
好友
3
蛮牛币
133
威望
0
注册时间
2016-10-2
在线时间
131 小时
最后登录
2019-3-25
QQ
2016-11-25 13:56:33 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 manew_JR 于 2016-11-25 14:08 编辑

这个帖子将会展示怎么用着色器模拟细胞自动机。一个很著名的细胞模拟机叫《Game of the Life》由John Conway制作的,将会作为范例在这个教程中。要想知道怎样建立你的工程,查看这两个教程的第一部分:怎样用着色器做模拟效果和怎样用着色器来模拟烟雾


life.gif

·介绍
·第一部分:Conway的game of life
·第二部分:实施
·第三部分:优化
·第四部分:提升
·总结和文件下载
介绍
如果你看过教程如何用着色器模拟烟雾,你也许会发现相似的限定关于介绍着色器在模拟方面的内容。第一个最明显的事实是你不能改变任何其他的像素,尽管有一个正在迭代上但是你不能改变任何其他的像素。使用着色器有点像做一个循环,他只允许你编辑现在的项目
,这确使我们写出所有的方程式使我们的模拟以一个明确的形式。这可能不永远是有效的和可行的。

texture5.gif
如果我们用着色器做模拟,这是必须的去发现问题,来是它们更完美对于这些模拟器。非常幸运的是,有这样一类问题非常符合这个定义,术语细胞自动机是一个具体等级的模拟是指一个松散进化的生物过程。细胞自动机可以很好的概括为一个很好的质感基于网格的工艺。这背后的概念是每一个像素(或细胞)的状态取决于隔壁像素的状态,一些类似的事发生在细胞或者细菌上,它们通常根据周围的环境来改变自己,它们自己不会改变。
第一部分:Conway的game of the life
最著名的细胞自动机是game of life,由John Conway编写于1970年。它是基于一个网格,每一个细胞的死或者活,随着时间离散间隔,都根据这些简单的规则:
·种群数量之下 任何活着的细胞都有少许两个隔壁活细胞死了
·种群数量之上 任何活着的细胞有超过三个隔壁细胞死了
·繁殖  任何与三个活的邻居的死亡细胞都变成活的细胞。
·持续性  有两个或三个住在隔壁的活细胞,产生下一代。
这四个简单的规则被设计出来模拟一个繁殖过程,引入种群数量过少和种群数量过多的直接概念。Game of the life 不能复制一个现实中的繁殖过程,但是,它有难以置信的复杂程度,首先它已被证明图灵完成(turing-complete)。这意味着如果它能在网格网格中被正确编码,它能够运行任何程序和算法。Game of the life 是如此强大,没错,就是这么酷炫,你可以模拟真正的生命游戏在game of the life中。
Life in life.gif
第二部分:实施
如果我们想在着色器中重现Game of the life ,我们首先需要一种在纹理上创建网格状表示的方法这已经在本系列的第二部分中讨论,如何使用着色器模拟烟雾,该技术应用于片段着色器对单元相邻的细胞进行采样,需要在红色通道内进行编辑。
[C#] 纯文本查看 复制代码
// Cell centre
fixed2 uv = round(i.uv * _Pixels) / _Pixels;
half s = 1 / _Pixels;

float tl = tex2D(_MainTex, uv + fixed2(-s, -s)).r;        // Top Left
float cl = tex2D(_MainTex, uv + fixed2(-s, 0)).r;        // Centre Left
float bl = tex2D(_MainTex, uv + fixed2(-s, +s)).r;        // Bottom Left

float tc = tex2D(_MainTex, uv + fixed2(-0, -s)).r;        // Top Centre
float cc = tex2D(_MainTex, uv + fixed2(0, 0)).r;        // Centre Centre
float bc = tex2D(_MainTex, uv + fixed2(0, +s)).r;        // Bottom Centre

float tr = tex2D(_MainTex, uv + fixed2(+s, -s)).r;        // Top Right
float cr = tex2D(_MainTex, uv + fixed2(+s, 0)).r;        // Centre Right
float br = tex2D(_MainTex, uv + fixed2(+s, +s)).r;        // Bottom Right


第二部分是四个规则的实现:
[C#] 纯文本查看 复制代码
int count = tl + cl + bl + tc + bc + tr + cr + br;

// Death
if (count < 2 || count > 3)
        return float4(0, 0, 0, 1);
// Life
if (count == 3)
        return float4(1, 1, 1, 1);
// Stay
return cc;


白色和黑色分别指示活的细胞和死的细胞

The game of life 通常可以在环形网络上实现,这意味着上下和左右两边都是连同的,如果你想要它作为一个事件,请确保正在使用的渲染纹理是将Warp Mode设置为Repeat的情况下导入。在概念上,这几何的世界中可以表示为一个个体,连续的3d物体像下列的图片一样
Conway's Game of Life on a Torus(1).gif
为了避免任何问题,Filter mode设置为点也很重要

第三部分:改进
这个技术在我们之前描述的段落中有两个明显的缺点,第一个是改变规则需要实际改变着色器的代码。第二个是if语句在着色器使用时运行特缓慢,在个别情况下,可以用替代方法来表达规则,因为每一个细胞可以有任何数字的活的邻居从0到8,我们可以使用九个要素的数组来指示下一个状态:
[C++] 纯文本查看 复制代码
static int2 rule[9] =
{
        int2(0,0),
        int2(0,0),
        int2(1,0),        // 2 neighours = survive
        int2(0,1),        // 3 neighours = born
        int2(0,0),
        int2(0,0),
        int2(0,0),
        int2(0,0),
        int2(0,0),
};


每一个元素有两个部分,第一个指示当前细胞是否存留到下一个阶段。第二个是否创建一个新的细胞。这个规则现在可以表示为:
[C#] 纯文本查看 复制代码
int2 r = rule[count];
int status = cc * r.x + r.y;
return float4(status, status, status, 1);


重要的是要注意,为了使规则数值保持其值,关键字static是必要的
第四部分:提升
一个有趣的图像提升可以实现通过改变细胞的颜色来决定它已经活多久。这是可以实现的因为我们只使用我们纹理的红色通道来进行计算,其他通道可以填充其他颜色,在本教程的开头示例中,细胞变得越红,他们住的时间越长。
[C#] 纯文本查看 复制代码
float3 cc = tex2D(_MainTex, uv + fixed2(0, 0));
if (cc.r == 1 && status == 1)
        return float4(status, ccc.g*0.9, ccc.b*0.9, 1);
else
        return float4(status, status, status, 1);


总结和下载
细胞自动机是一个非常酷炫的工具,其在游戏开发中已经有很多实际的案例,Sebastain Lauge正在使用类似的技术来程序似的产生洞状结构。
细胞自动机可以模拟很多自然行为,包括水流动的方式。这将在本系列的下一部分中介绍
你可以在附件中下载本教程的unity工程项目
视频和工程文件还可以查看百度云链接:

[size=13.3333px]http://pan.baidu.com/s/1mijmWAk


原文作者:Alan Zucconi
原文链接:http://www.alanzucconi.com/2016/03/16/cellular-automata-with-shaders/
     蛮牛译林军福利多多哦!
图片1.png

本文由蛮牛译员:neosuo独家翻译,如有问题,请及时联系,除合作媒体及合作伙伴外,禁止转载。


life.gif_20161125055430.JPG

life.zip

22.36 KB, 下载次数: 516

工程文件

回复

使用道具 举报

5熟悉之中
695/1000
排名
13718
昨日变化
1

1

主题

98

帖子

695

积分

Rank: 5Rank: 5

UID
1944
好友
3
蛮牛币
1290
威望
0
注册时间
2013-8-13
在线时间
534 小时
最后登录
2019-5-18
2016-11-25 14:23:10 显示全部楼层
细胞自动机,好高级。。。先Mark一下
回复 支持 反对

使用道具 举报

7日久生情
4531/5000
排名
30
昨日变化

0

主题

342

帖子

4531

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
27214
好友
0
蛮牛币
17464
威望
0
注册时间
2014-5-29
在线时间
1054 小时
最后登录
2019-5-27

VIP

QQ
2016-11-25 16:19:48 显示全部楼层
收藏,感谢分享!
回复

使用道具 举报

排名
1626
昨日变化

15

主题

250

帖子

1924

积分

Rank: 9Rank: 9Rank: 9

UID
18798
好友
10
蛮牛币
1697
威望
0
注册时间
2014-3-24
在线时间
793 小时
最后登录
2019-5-17

专栏作家VIP

QQ
2016-11-25 16:43:06 显示全部楼层
不明觉厉 不觉明历
回复 支持 反对

使用道具 举报

5熟悉之中
625/1000
排名
3457
昨日变化

0

主题

31

帖子

625

积分

Rank: 5Rank: 5

UID
181034
好友
1
蛮牛币
1945
威望
0
注册时间
2016-11-12
在线时间
162 小时
最后登录
2019-5-21
2016-11-25 16:46:24 显示全部楼层

收藏,感谢分享!
回复

使用道具 举报

3偶尔光临
258/300
排名
8010
昨日变化

1

主题

35

帖子

258

积分

Rank: 3Rank: 3Rank: 3

UID
159868
好友
3
蛮牛币
688
威望
0
注册时间
2016-8-1
在线时间
66 小时
最后登录
2018-9-3
2016-11-25 17:13:23 显示全部楼层
好高大上的样子啊
回复 支持 反对

使用道具 举报

4四处流浪
458/500
排名
5511
昨日变化

0

主题

73

帖子

458

积分

Rank: 4

UID
168796
好友
0
蛮牛币
476
威望
0
注册时间
2016-9-16
在线时间
127 小时
最后登录
2019-5-16
QQ
2016-11-26 00:07:16 显示全部楼层
收藏,感谢分享!
回复

使用道具 举报

排名
10342
昨日变化

5

主题

54

帖子

334

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
173275
好友
3
蛮牛币
133
威望
0
注册时间
2016-10-2
在线时间
131 小时
最后登录
2019-3-25
QQ
楼主 2016-11-26 02:32:41 显示全部楼层
lzqlawrence 发表于 2016-11-25 14:23
细胞自动机,好高级。。。先Mark一下

是个生物学术名词,就是细胞繁殖的过程应该
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1173/1500
排名
2066
昨日变化

0

主题

247

帖子

1173

积分

Rank: 6Rank: 6Rank: 6

UID
180505
好友
2
蛮牛币
1130
威望
0
注册时间
2016-11-3
在线时间
258 小时
最后登录
2018-4-3
QQ
2016-11-26 07:50:42 显示全部楼层
酷炫掉渣天。真的厉害
回复 支持 反对

使用道具 举报

8常驻蛮牛
5846/10000
排名
136
昨日变化

82

主题

879

帖子

5846

积分

Rank: 8Rank: 8

UID
120040
好友
2
蛮牛币
3797
威望
0
注册时间
2015-8-28
在线时间
2507 小时
最后登录
2019-5-27
2016-11-26 13:12:40 显示全部楼层
涨姿势了……
回复

使用道具 举报

7日久生情
2063/5000
排名
825
昨日变化

1

主题

254

帖子

2063

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
25893
好友
2
蛮牛币
5370
威望
0
注册时间
2014-5-20
在线时间
622 小时
最后登录
2019-3-25
2016-11-26 13:44:56 显示全部楼层
好帖!!!!!!
回复

使用道具 举报

5熟悉之中
505/1000
排名
6391
昨日变化

4

主题

149

帖子

505

积分

Rank: 5Rank: 5

UID
175029
好友
5
蛮牛币
1026
威望
0
注册时间
2016-10-12
在线时间
140 小时
最后登录
2018-10-18
2016-11-26 14:16:23 显示全部楼层
不错啊,6666666
回复

使用道具 举报

5熟悉之中
569/1000
排名
5141
昨日变化

4

主题

93

帖子

569

积分

Rank: 5Rank: 5

UID
130665
好友
4
蛮牛币
32
威望
0
注册时间
2015-12-3
在线时间
192 小时
最后登录
2019-5-24
2016-11-26 17:08:12 显示全部楼层
看不懂啊啊啊
回复

使用道具 举报

排名
19947
昨日变化

0

主题

16

帖子

61

积分

Rank: 2Rank: 2

UID
186133
好友
0
蛮牛币
8
威望
0
注册时间
2016-11-23
在线时间
19 小时
最后登录
2018-1-19
2016-11-26 19:46:45 显示全部楼层
感觉好厉害
回复

使用道具 举报

5熟悉之中
874/1000
排名
3998
昨日变化

5

主题

173

帖子

874

积分

Rank: 5Rank: 5

UID
182321
好友
0
蛮牛币
64
威望
0
注册时间
2016-11-9
在线时间
325 小时
最后登录
2019-2-11
2016-11-28 09:46:12 显示全部楼层
书读百遍其义自见,我还得读99遍啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则