水面焦散着色器:浅水上的光

清澈的浅水铺在沙底上,涟漪把阳光聚成游动的光网。由 WebGPU 程序在你的浏览器里逐帧实时画出。

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

请求原话

“晴天,清澈的浅水下面是浅色的沙底。微风吹皱水面,水面波光粼粼;被小浪聚起的光在水底织成明亮、流动的光网。”

它是怎样画的

焦散就是泳池底那些明亮的光网。每个小浪都是一面透镜:弯曲的水面把阳光折向同一处时,光聚成一条亮线;亮线之间光被摊薄,沙底就暗一些。

程序用 64 组波列搭出水面,从一米长的涌浪到两厘米的涟漪,每组都按真实水体在这个水深下给它这个波长的速度传播。每一帧,它让阳光穿过铺在水面上的一张细网折射下去,把每个三角形移到它的光落在水底的位置:缩小的三角形把同样多的光挤进更小的面积,于是更亮。红、绿、蓝三色折射得略有不同,光网边缘因此带一点颜色。

然后每个像素沿自己的视线走:在水面上反射天空,更细的涟漪把某个小面转向太阳时就闪一下;穿过水面则折射到沙子和卵石上,被光网照亮,并被途经的水染色。每组波在一个循环里都走整数个周期,所以影片首尾无缝衔接。

它怎样运行

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

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

做你自己的

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

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

做动画用的着色器效果

接着看