肥皂泡着色器:薄膜干涉的颜色

几个肥皂泡在暖色逆光里飘,泡膜上的颜色不停旋动,直到其中一个变薄发黑、破裂。由 WebGPU 程序在你的浏览器里实时画出。

在你的显卡上边看边画。这段程序是为本站手写的,不是 Agent 做的。

请求原话

“深色背景前,几个肥皂泡在暖色逆光里慢慢飘。泡膜流动、变薄,上面的颜色跟着打旋;膜顶快破之前会变黑,然后其中一个破掉。”

它是怎样画的

肥皂膜只有几百纳米厚。光从它的外表面和内表面各反射一次,两束反射光相互干涉:在某个厚度下,有的波长被加强,有的被抵消,所以泡膜的颜色取决于它有多厚、从什么角度看。膜比光的波长薄得多时,反射几乎完全抵消,看上去就是黑的——泡泡破之前正是这样。

颜色是算出来的,不是画上去的。程序对 81 个波长,把薄膜在各个角度、两种偏振下的反射率,经人眼的配色函数累加起来,得到一张“厚度 × 角度 → 颜色”的表。

厚度本身也在流动。每个泡泡逐帧保存一张覆盖整个球面的膜厚图:重力把膜往下引,上薄下厚;缓慢的涡流搅动它,薄的上浮、厚的下沉,卷成真实泡泡上那种大理石般的纹路。每个像素沿视线穿过它碰到的每一层膜,所以一个泡泡会把你身后的窗户映出两次,一正一倒。最后一秒半里,所有泡膜慢慢回到开始时的样子,影片因此循环。

它怎样运行

它是一个画面程序:用 WebGPU⁠ (外部网站,在新标签页打开) 画出画面的 JavaScript 模块,和编辑器里画面程序效果运行的程序是同一种。它在这里的播放方式和编辑器一样,在画面沙箱⁠ (在新标签页打开)里:另一个源上的页面,碰不到本页、你的存储和网络,只被告知要画哪一帧。

它没有时钟,也不用随机数,所以同一帧不论怎样到达都画得一样,最后一帧接回第一帧。设备太慢时停在静帧;没有 WebGPU 的地方,画面上会说明。

做你自己的

在编辑器里,着色器、模拟或画面程序效果接受你编写或粘贴⁠ (在新标签页打开)的程序,先在你的电脑上检查并试跑,再写进项目。程序声明的设置会成为可以在时间轴上打关键帧的属性;这件作品没有声明设置,你的可以有。

Agent⁠ (在新标签页打开) 也能按上面这样的请求写出程序,作为草稿交给你审核。这属于 Agent 订阅,订阅即将开放;自己写是免费的。

做动画用的着色器效果

接着看