GLSL 效果示例

生命游戏:用纹理记录细胞的生灭

每个纹素是一个细胞,数八个邻居并执行 B3/S23。初始滑翔机种子固定重复,便于复现;边界夹紧而不循环。

在线示例

修改右侧代码,左侧预览会实时更新。

观察什么

以滑翔机作初始图案,可暂停和单步观察演化。

实现原理

每个纹素是一个细胞,数八个邻居并执行 B3/S23。初始滑翔机种子固定重复,便于复现;边界夹紧而不循环。

找到控制效果的代码

float alive=texture2D(u_cells,(floor(uv*80.)+.5)/u_resolution).r;c=mix(vec3(.02,.04,.1),vec3(.3,.95,.65),alive);

u_cells 执行八邻居规则,Fragment 放大状态纹理的一部分用于显示。把 Fragment 的 floor(uv*80.) 改为 floor(uv*160.),可显示同一细胞状态中更大范围的区域,而不是改变模拟规则。

动手修改

暂停后用单步查看重复的滑翔机种子如何逐代移动。在 u_cells 中把 neighbors==3. 改为 neighbors==4.,出生规则便会改变,原滑翔机也不再遵循康威规则下的运动方式。

调试与成本

每次更新读取当前细胞及八个邻居;mod(floor(gl_FragCoord.xy),32.) 让种子每 32 个纹素重复。把 32. 改为 16.,目标里会初始化更多滑翔机;显示仍只放大 floor(uv*80.) 选定的区域。

用到的内置函数

一步步学会这个效果