一幅自己把自己画出来的画
图库里的每一种手笔都从同一份源出两样东西:完成的静帧,以及一部把它画出来的影片,一笔接一笔,按那种媒介的画家作画的顺序。影片的最后几帧就是那张静帧,逐像素一致。这就是人们会分享的延时绘制、幕后制作、教学步骤,以及讲解片里图解逐步拼出来的过程。
规则
- 第 0 帧是空白的底子:纸、板、亚麻画布、黑色刮画泥板、空白的屏幕。
- 媒介自己的顺序:水彩先用铅笔起稿,然后是浅色渲染、深色渲染、细节、勾线。木刻先印主版,再从浅到深印各个色版。像素画先铺平的色块,清理线条,给色簇上阴影,再加高光。油画先给底子上一层色调,从暗到亮铺大色块,最后厚涂收尾。刺绣把每一针都拉过布面。每个样张的文件头都写明了它的顺序。
- 笔触是画出来的,绝不是淡入的:一道笔画沿着它的路径生长,一片渲染从笔尖触纸的地方晕开,一块积木落下并卡实,一枚印章盖下去。
- 手的节奏:长笔画快,细碎的笔画慢,两遍之间有短暂的停顿(最多半秒;对
kind: "drawing",闸门允许这样的停顿)。 - 最后一段就是静帧:用
meta.holds声明它,让闸门知道这是有意为之。
怎么做一部
声明 meta.kind: "drawing" 和最后的定格。然后二选一:
- 编写过程:把笔触列成带时间的操作,在一个只增不减的缓存上回放(就是
colouredPencilKit.ts的replay、sumiEKit.ts的runProcess、brokenColourKit.ts的staged里用的模式);或者 - 给现有的样张加一个时钟:一个可选参数,按每个绘制调用所属的遍次放行它;没有时钟时,样张画得和以前完全一样(改动前后检查主图的 md5)。
对建立在回放缓存上的过程影片,设置 meta.raster: "cpu";GPU 光栅化和软件光栅化混用会破坏确定性。
绘制过程片的闸门
kind: "drawing" 以一秒为窗口、以 0.02% 的变化面积为下限来判定冷场(细铅笔线每帧改变的很少),并允许最长半秒的停顿。比这更长的冻结仍然判为失败,因为观众看得出来。