霜花着色器:在玻璃上生长的冰晶
寒夜里,霜从窗户一角长满玻璃,分出羽毛般的冰枝,玻璃后面房间的暖灯柔和地亮着。由 WebGPU 程序在你的浏览器里实时画出。
在你的显卡上边看边画。这段程序是为本站手写的,不是 Agent 做的。
请求原话
“寒夜,隔着一扇窗玻璃。冰花从窗的下角开始长,在玻璃上分叉成细细的羽毛状冰晶,映着光;玻璃后面,房间里的暖色灯光柔和地虚化着。”
它是怎样画的
霜是在冷玻璃上结晶的冰。冰沿晶体的六重对称方向长得最快,而水结冰时放出的热又拖慢了前沿后面的冰,于是前沿分出枝杈,枝杈上再分小枝:就是冷天早晨窗上的羽毛状霜花。
程序用小林(Kobayashi)的凝固相场模型来长霜,网格大约一个像素一格,由宿主在帧与帧之间保存。每格记着一个相(玻璃或冰)和冰放出的热。每一步,在玻璃够冷的地方相向冰推进,沿每个晶体自己的六个方向更快;热量扩散开并减慢生长,一点噪声引出侧枝。玻璃在下角和窗框边最冷,所以霜从那里开始,越往玻璃中间长得越慢。
然后每个像素透过它所在位置的冰去看:薄冰在边缘折弯房间的光,更老更厚的冰把光散成柔和的一片,冰的小晶面随视角漂移各自映到或映不到一盏灯。光秃的玻璃起了雾,只有冰的周围被它放出的热烘干。最后几秒霜按从新到旧的顺序退回去,回到影片开始时的样子。
它怎样运行
它是一个画面程序:用 WebGPU (外部网站,在新标签页打开) 画出画面的 JavaScript 模块,和编辑器里画面程序效果运行的程序是同一种。它在这里的播放方式和编辑器一样,在画面沙箱 (在新标签页打开)里:另一个源上的页面,碰不到本页、你的存储和网络,只被告知要画哪一帧。
它没有时钟,也不用随机数,所以同一帧不论怎样到达都画得一样,最后一帧接回第一帧。设备太慢时停在静帧;没有 WebGPU 的地方,画面上会说明。
做你自己的
在编辑器里,着色器、模拟或画面程序效果接受你编写或粘贴 (在新标签页打开)的程序,先在你的电脑上检查并试跑,再写进项目。程序声明的设置会成为可以在时间轴上打关键帧的属性;这件作品没有声明设置,你的可以有。
Agent (在新标签页打开) 也能按上面这样的请求写出程序,作为草稿交给你审核。这属于 Agent 订阅,订阅即将开放;自己写是免费的。