GLSL 效果示例

火焰

程序化火焰 shader:向上流动的 fBm 噪声被塑造成火苗形状,再映射到黑、红、黄、白的颜色渐变。

在线示例

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

工作原理

这里的火焰由三部分组成:形状、湍流和颜色渐变。

形状。1.0 - uv.y * 1.1 - abs(x) * 1.8 是一个类似三角形的渐变:底部中央是 100%,往上、往两边逐渐减弱。单独看,它是一个平滑、静止的锥形。

湍流。fbm(...) 往这个锥形上叠加多层噪声。y 坐标减去 u_time * 1.5 让噪声向上滚动,于是火舌不断断开、往上窜。(n - 0.5) * 0.9 让噪声以 0 为中心,边缘会被往里推也会被往外推。

颜色。heat 是一个 0 到 1 的值。第一项把它变成红色和橙色;pow(heat, 4.0) 除了最热的地方几乎都是 0,所以黄白色只出现在火芯。真实的火焰也是这样:气体越热,发出的光越接近白色。

试着改一改

修改效果
u_time * 1.5 改成 u_time * 4.0猛烈、燃烧很快的火
abs(x) * 1.8 改成 abs(x) * 4.0细细的蜡烛火苗
* 0.9 改成 * 1.6边缘更狂野、更破碎
vec3(1.5, 0.5, 0.1) 改成 vec3(0.1, 0.5, 1.5)蓝色的燃气火焰

用到的内置函数

一步步学会这个效果