Unity Shader 系列(二十二):Compute Shader 实现元胞自动机
元胞自动机(Cellular Automata)和反应扩散系统(Reaction-Diffusion)是程序化纹理生成的强大工具。在 Unity 中,Compute Shader 让这些计算密集型模拟可以完全在 GPU 上运行,以极高效率生成皮革纹、斑纹、裂纹、生命游戏等动态或静态纹理。
为什么用 Compute Shader?
传统 CPU 实现的元胞自动机每帧需要遍历所有格子(O(N²)),1024×1024 的网格每帧需要约 100 万次计算,CPU 难以实时完成。Compute Shader 将每个格子的计算分配给一个 GPU 线程,在并行执行下可在数毫秒内完成百万次计算。
生命游戏:Compute Shader 完整实现
Compute Shader(GameOfLife.compute)
1 | |
C# 控制脚本(GameOfLifeController.cs)
1 | |
Gray-Scott 反应扩散系统:生成兽皮纹理
Gray-Scott 系统用两种物质 U(激活剂)和 V(抑制剂)的扩散反应模拟自然界中的图案生成——豹纹、斑马纹、珊瑚纹都源于此类机制。
Compute Shader(ReactionDiffusion.compute)
1 | |
关键参数对照表(图案类型)
| F(进料率) | k(消除率) | 生成图案 |
|---|---|---|
| 0.035 | 0.065 | 斑点(豹纹) |
| 0.040 | 0.060 | 波纹条纹(斑马纹) |
| 0.025 | 0.055 | 迷宫纹(脑珊瑚) |
| 0.050 | 0.065 | 孤子(稳定泡泡) |
| 0.060 | 0.062 | 不稳定增殖(细菌样) |
URP Renderer Feature 可视化
将计算结果实时渲染到场景需要自定义 Renderer Feature。
1 | |
程序化纹理应用:皮革/斑纹/裂纹材质
反应扩散系统的稳定状态(运行足够帧数后)可以直接烘焙为静态纹理用于材质:
1 | |
游戏实战应用
传染病/火势蔓延模拟:将生命游戏规则改为有概率传播的 SIR(易感-感染-恢复)模型,用于 RTS 游戏的地图事件或 Roguelike 游戏的火焰蔓延。
程序化 Boss 皮肤动态变化:在 Boss 战中实时运行 RD 系统,让 Boss 的皮肤纹理随血量/阶段变化,从规则斑点变为混乱条纹。
地图生成辅助:用元胞自动机生成洞穴/地下城地图(经典 Cave Generation 算法),再用 Marching Squares 转换为可行走网格。
性能考量
numthreads(8, 8, 1)在大多数 GPU 上效率最佳,不要使用(1, 1, 1)- 512×512 的 RD 模拟在现代 GPU 上每帧约 0.2ms,1024×1024 约 1ms
- 避免在 Compute Shader 中使用随机写入(atomic 操作),CA 的读写分离天然避免了这个问题
- 移动端 Compute Shader 支持需要 OpenGL ES 3.1 或 Metal(iOS 8+),务必在 Player Settings 中检查
元胞自动机和反应扩散系统是”用极简规则生成无限复杂图案”的完美范例。在 Unity 的 Compute Shader 加持下,这些原本只存在于学术模拟中的系统,可以变成游戏中实时跳动的有机纹理。
Unity Shader 系列(二十二):Compute Shader 实现元胞自动机
https://alex-rachel.github.io/2026/04/01/22-cellular-automata/