写成代码的画面:为什么 Keyframe 的着色器是项目数据
在 AE 里写一个着色器要编译插件;在 Keyframe 里,程序就是项目里的数据,在沙箱里跑在你的显卡上。
先看一遍
下面的水面是一段正在你浏览器里运行的画面程序。
它和作品集里的其他几件一样,是为本站手写的,不是 Agent 做的。 水面的光
在 After Effects 里,自写着色器要编译插件
AE 曾经能直接加载 Pixel Bender 着色器,CS6 起这条路没有了。
- 2008 · CS4可以把 Pixel Bender 着色器当作效果加载
- 2012 · CS6Pixel Bender 支持被移除
- 今天用 C++ SDK 编译 GPU 效果插件,或装 PixelsWorld 这类第三方桥接插件
今天想在 AE 里写一个自己的 GPU 效果,正路是用 C++ SDK 写插件,配上 CUDA、Metal 或 DirectX 的代码编译,再装到每一台要用它的电脑上。
另一条路是装第三方的桥接插件,比如 PixelsWorld,它本身是编译好的插件,让你在里面写 GLSL 风格的代码。
为什么会这样
AE 的核心是闭源的,自定义画面只能从插件这个口子进来。
效果插件是 AE 留给外部开发者画像素的口子,它运行的是编译好的本机代码,所以要按平台编译、按机器安装。一段着色器源码本身不能作为工程的一部分保存和运行。
结果是:工程用到的效果,取决于每台电脑装了什么插件;AI 也没法安全地替你写一个、当场跑起来看看效果。
在 Keyframe 里:三种程序都是项目数据
着色器、模拟和画面程序的源码存在效果里,跟着工程走。

- 程序的源码。
- 它读取的设置。
- 检查、试跑,通过后写进项目。
- 着色器:WGSL (外部网站,在新标签页打开) 程序,对图层的每个像素各运行一次,用来做图案、调色、扭曲。
- 模拟:处理一组由显卡逐帧记住状态的元素,用来做粒子、布料、波纹和拖尾;你只写元素怎样开始、前进和画出。
- 画面程序:用 WebGPU 画出整个图层的 JavaScript (外部网站,在新标签页打开) 模块,做前两种做不出的东西。
画面程序在另一个源上的沙箱里运行
它只被告知画第几帧,碰不到编辑器、你的项目和网络。
编辑器的页面
- 你的项目与存储
- 登录状态
- 网络
- 帧号
- 参数
- 尺寸
画面
沙箱(另一个源)
- 画面程序在 Worker 里运行
- 没有时钟,不用随机数
画面程序是最宽的一种,所以关得最严:它在另一个源的页面里的 Worker 中运行,编辑器只交给它帧号、参数和画面尺寸。它没有自己的时钟,也不用随机数,所以直接跳到某一帧和一路播放到那一帧,结果一样。
着色器和模拟程序也一样:先由编辑器检查、在你的显卡上试跑,通过之后才写进项目,算一步,可以撤销。
它的设置就是可以打关键帧的属性
程序声明的每个设置都出现在效果控件里。

- 程序效果。
- 打开程序编辑器。
- 程序声明的设置。
- 给设置打关键帧。
数值、角度、颜色、图层上的点、开关或选项,都能拖动、打关键帧 (在新标签页打开)、用表达式驱动。预览和导出跑的是同一段程序,在同一台电脑上画出同样的帧。
也可以让 Agent 写
描述你要的效果,Agent 写成程序、试跑、看帧、再改,最后交给你审核。
这正是程序做成项目数据的好处:Agent (在新标签页打开) 写的是数据,不是应用代码,它要经过和你手写的程序一样的检查和沙箱。由 Agent 写程序属于 Agent 订阅(即将开放);你自己写是免费的。