开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

蛮牛译馆

关注:546

当前位置:游戏蛮牛 技术专区 蛮牛译馆

查看: 4027|回复: 51

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

[复制链接]  [移动端链接]
排名
10815
昨日变化
7

5

主题

25

帖子

192

积分

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

UID
173275
好友
1
蛮牛币
332
威望
0
注册时间
2016-10-2
在线时间
63 小时
最后登录
2017-7-9
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, 下载次数: 100

工程文件


回复

使用道具 举报

5熟悉之中
511/1000
排名
11351
昨日变化
10

1

主题

81

帖子

511

积分

Rank: 5Rank: 5

UID
1944
好友
1
蛮牛币
957
威望
0
注册时间
2013-8-13
在线时间
375 小时
最后登录
2017-7-20
发表于 2016-11-25 14:23:10 | 显示全部楼层
细胞自动机,好高级。。。先Mark一下
[发帖际遇]: lzqlawrence 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

7日久生情
2933/5000
排名
89
昨日变化
1

0

主题

302

帖子

2933

积分

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

UID
27214
好友
0
蛮牛币
10181
威望
0
注册时间
2014-5-29
在线时间
657 小时
最后登录
2017-7-28

VIP

QQ
发表于 2016-11-25 16:19:48 | 显示全部楼层
收藏,感谢分享!

回复

使用道具 举报

排名
1806
昨日变化

10

主题

205

帖子

1409

积分

Rank: 9Rank: 9Rank: 9

UID
18798
好友
6
蛮牛币
4630
威望
0
注册时间
2014-3-24
在线时间
568 小时
最后登录
2017-7-28

专栏作家VIP

QQ
发表于 2016-11-25 16:43:06 | 显示全部楼层
不明觉厉 不觉明历

回复 支持 反对

使用道具 举报

4四处流浪
444/500
排名
3492
昨日变化
16

0

主题

25

帖子

444

积分

Rank: 4

UID
181034
好友
1
蛮牛币
1275
威望
0
注册时间
2016-11-12
在线时间
111 小时
最后登录
2017-7-28
发表于 2016-11-25 16:46:24 | 显示全部楼层

收藏,感谢分享!

回复

使用道具 举报

3偶尔光临
245/300
排名
6450
昨日变化
5

1

主题

42

帖子

245

积分

Rank: 3Rank: 3Rank: 3

UID
159868
好友
3
蛮牛币
652
威望
0
注册时间
2016-8-1
在线时间
56 小时
最后登录
2017-7-24
发表于 2016-11-25 17:13:23 | 显示全部楼层
好高大上的样子啊

回复 支持 反对

使用道具 举报

4四处流浪
392/500
排名
4221
昨日变化
4

0

主题

46

帖子

392

积分

Rank: 4

UID
168796
好友
0
蛮牛币
630
威望
0
注册时间
2016-9-16
在线时间
96 小时
最后登录
2017-7-27
QQ
发表于 2016-11-26 00:07:16 | 显示全部楼层
收藏,感谢分享!

回复

使用道具 举报

排名
10815
昨日变化
7

5

主题

25

帖子

192

积分

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

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

是个生物学术名词,就是细胞繁殖的过程应该

回复 支持 反对

使用道具 举报

5熟悉之中
778/1000
排名
2980
昨日变化
10

0

主题

245

帖子

778

积分

Rank: 5Rank: 5

UID
180505
好友
2
蛮牛币
414
威望
0
注册时间
2016-11-3
在线时间
173 小时
最后登录
2017-7-28
QQ
发表于 2016-11-26 07:50:42 | 显示全部楼层
酷炫掉渣天。真的厉害

回复 支持 反对

使用道具 举报

7日久生情
3220/5000
排名
408
昨日变化

38

主题

574

帖子

3220

积分

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

UID
120040
好友
0
蛮牛币
2966
威望
0
注册时间
2015-8-28
在线时间
1344 小时
最后登录
2017-7-28
发表于 2016-11-26 13:12:40 | 显示全部楼层
涨姿势了……

回复

使用道具 举报

7日久生情
1810/5000
排名
678
昨日变化
3

1

主题

229

帖子

1810

积分

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

UID
25893
好友
2
蛮牛币
4986
威望
0
注册时间
2014-5-20
在线时间
552 小时
最后登录
2017-7-28
发表于 2016-11-26 13:44:56 | 显示全部楼层
好帖!!!!!!

回复

使用道具 举报

4四处流浪
489/500
排名
5030
昨日变化
5

4

主题

150

帖子

489

积分

Rank: 4

UID
175029
好友
5
蛮牛币
999
威望
0
注册时间
2016-10-12
在线时间
135 小时
最后登录
2017-7-22
发表于 2016-11-26 14:16:23 | 显示全部楼层
不错啊,6666666
[发帖际遇]: 上善若水jf 捡了钱没交公 蛮牛币 降了 2 . 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
418/500
排名
4985
昨日变化
2

3

主题

77

帖子

418

积分

Rank: 4

UID
130665
好友
3
蛮牛币
540
威望
0
注册时间
2015-12-3
在线时间
132 小时
最后登录
2017-7-28
发表于 2016-11-26 17:08:12 | 显示全部楼层
看不懂啊啊啊

回复

使用道具 举报

排名
15795
昨日变化
8

0

主题

18

帖子

61

积分

Rank: 2Rank: 2

UID
186133
好友
0
蛮牛币
7
威望
0
注册时间
2016-11-23
在线时间
19 小时
最后登录
2017-6-8
发表于 2016-11-26 19:46:45 | 显示全部楼层
感觉好厉害

回复

使用道具 举报

5熟悉之中
729/1000
排名
3492
昨日变化
16

4

主题

147

帖子

729

积分

Rank: 5Rank: 5

UID
182321
好友
0
蛮牛币
599
威望
0
注册时间
2016-11-9
在线时间
268 小时
最后登录
2017-7-28
发表于 2016-11-28 09:46:12 | 显示全部楼层
书读百遍其义自见,我还得读99遍啊。

回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表