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

扫一扫,访问微社区

蛮牛译馆

关注:531

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

查看: 3048|回复: 39

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

[复制链接]  [移动端链接]
排名
10792
昨日变化
16

5

主题

24

帖子

183

积分

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

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

工程文件


回复

使用道具 举报

4四处流浪
497/500
排名
10969
昨日变化
7

1

主题

78

帖子

497

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

7日久生情
2761/5000
排名
95
昨日变化
1

0

主题

291

帖子

2761

积分

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

UID
27214
好友
0
蛮牛币
9541
威望
0
注册时间
2014-5-29
在线时间
610 小时
最后登录
2017-5-26

VIP

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

回复

使用道具 举报

排名
1947
昨日变化
6

9

主题

195

帖子

1316

积分

Rank: 9Rank: 9Rank: 9

UID
18798
好友
6
蛮牛币
3814
威望
0
注册时间
2014-3-24
在线时间
540 小时
最后登录
2017-5-26

专栏作家VIP

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

回复 支持 反对

使用道具 举报

4四处流浪
318/500
排名
4442
昨日变化
2

0

主题

19

帖子

318

积分

Rank: 4

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

收藏,感谢分享!

回复

使用道具 举报

3偶尔光临
239/300
排名
6345
昨日变化
6

1

主题

42

帖子

239

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

4四处流浪
374/500
排名
4222
昨日变化
1

0

主题

46

帖子

374

积分

Rank: 4

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

回复

使用道具 举报

排名
10792
昨日变化
16

5

主题

24

帖子

183

积分

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

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
623/1000
排名
3891
昨日变化
32

0

主题

223

帖子

623

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

7日久生情
2923/5000
排名
467
昨日变化

33

主题

528

帖子

2923

积分

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

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

回复

使用道具 举报

7日久生情
1756/5000
排名
682
昨日变化

1

主题

227

帖子

1756

积分

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

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

回复

使用道具 举报

4四处流浪
474/500
排名
5035
昨日变化
2

4

主题

147

帖子

474

积分

Rank: 4

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

回复

使用道具 举报

4四处流浪
387/500
排名
4982
昨日变化
3

3

主题

66

帖子

387

积分

Rank: 4

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

回复

使用道具 举报

排名
16390
昨日变化
14

0

主题

17

帖子

54

积分

Rank: 2Rank: 2

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

回复

使用道具 举报

5熟悉之中
532/1000
排名
4285
昨日变化
34

4

主题

102

帖子

532

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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