GLSL 效果示例

反应扩散:让斑点在平面上长成条纹

改变反应参数后,斑点与条纹经历连续演化。

在线示例

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

观察什么

改变反应参数后,斑点与条纹经历连续演化。

实现原理

两个颜色通道保存 A、B 浓度,扩散、反应、补给和移除项共同推进 Gray–Scott 模型。改变参数会改变演化方向;需要多帧才能出现成熟结构。

找到控制效果的代码

vec2 ab=texture2D(u_reaction,uv).rg;c=mix(vec3(.03,.06,.16),vec3(.95,.7,.3),smoothstep(.05,.35,ab.y));

u_reaction 用红通道保存 A、绿通道保存 B,而 Fragment 目前只通过 smoothstep(.05,.35,ab.y) 给 B 着色。把其中 ab.y 改为 ab.x,可查看另一种浓度,不改动更新方程。

动手修改

把 u_parameter 从 0 调到 1,u_reaction 的 kill 会从 .055 变为 .067。每次重置后运行许多帧:富含 B 的区域生长与消失之间的平衡会改变,成熟图案因此可能不同。

调试与成本

每次更新读取中心及八个邻居,再把 A、B 存入 RGBA8 通道。把 feed=.035 降为 .025,可独立改变补给而不改变 kill;八位舍入和按帧更新仍会限制数值精度与速率一致性。

用到的内置函数

一步步学会这个效果