写成代码的画面:为什么 Keyframe 的着色器是项目数据

设计札记

在 AE 里写一个着色器要编译插件;在 Keyframe 里,程序就是项目里的数据,在沙箱里跑在你的显卡上。

先看一遍

下面的水面是一段正在你浏览器里运行的画面程序。

它和作品集里的其他几件一样,是为本站手写的,不是 Agent 做的。 水面的光

在 After Effects 里,自写着色器要编译插件

AE 曾经能直接加载 Pixel Bender 着色器,CS6 起这条路没有了。

  1. 2008 · CS4可以把 Pixel Bender 着色器当作效果加载
  2. 2012 · CS6Pixel Bender 支持被移除
  3. 今天用 C++ SDK 编译 GPU 效果插件,或装 PixelsWorld 这类第三方桥接插件

今天想在 AE 里写一个自己的 GPU 效果,正路是用 C++ SDK 写插件,配上 CUDA、Metal 或 DirectX 的代码编译,再装到每一台要用它的电脑上。

另一条路是装第三方的桥接插件,比如 PixelsWorld,它本身是编译好的插件,让你在里面写 GLSL 风格的代码。

为什么会这样

AE 的核心是闭源的,自定义画面只能从插件这个口子进来。

效果插件是 AE 留给外部开发者画像素的口子,它运行的是编译好的本机代码,所以要按平台编译、按机器安装。一段着色器源码本身不能作为工程的一部分保存和运行。

结果是:工程用到的效果,取决于每台电脑装了什么插件;AI 也没法安全地替你写一个、当场跑起来看看效果。

在 Keyframe 里:三种程序都是项目数据

着色器、模拟和画面程序的源码存在效果里,跟着工程走。

程序编辑器:源码、它读取的设置,以及应用按钮
  1. 程序的源码。
  2. 它读取的设置。
  3. 检查、试跑,通过后写进项目。

画面程序在另一个源上的沙箱里运行

它只被告知画第几帧,碰不到编辑器、你的项目和网络。

编辑器的页面

  • 你的项目与存储
  • 登录状态
  • 网络
  • 帧号
  • 参数
  • 尺寸

画面

沙箱(另一个源)

  • 画面程序在 Worker 里运行
  • 没有时钟,不用随机数

画面程序是最宽的一种,所以关得最严:它在另一个源的页面里的 Worker 中运行,编辑器只交给它帧号、参数和画面尺寸。它没有自己的时钟,也不用随机数,所以直接跳到某一帧和一路播放到那一帧,结果一样。

着色器和模拟程序也一样:先由编辑器检查、在你的显卡上试跑,通过之后才写进项目,算一步,可以撤销。

它的设置就是可以打关键帧的属性

程序声明的每个设置都出现在效果控件里。

效果控件里的程序效果:编辑程序按钮和它声明的设置,设置旁有关键帧秒表
  1. 程序效果。
  2. 打开程序编辑器。
  3. 程序声明的设置。
  4. 给设置打关键帧。

数值、角度、颜色、图层上的点、开关或选项,都能拖动、打关键帧⁠ (在新标签页打开)、用表达式驱动。预览和导出跑的是同一段程序,在同一台电脑上画出同样的帧。

也可以让 Agent 写

描述你要的效果,Agent 写成程序、试跑、看帧、再改,最后交给你审核。

这正是程序做成项目数据的好处:Agent⁠ (在新标签页打开) 写的是数据,不是应用代码,它要经过和你手写的程序一样的检查和沙箱。由 Agent 写程序属于 Agent 订阅(即将开放);你自己写是免费的。

接着看