水墨画(sumi-e,画在宣纸上)
模块:engine/src/canvas-core/sumiE.ts(工具集:sumiEKit.ts)。主画面:风中的竹子和一只树麻雀。
媒介的物理形态。 一支软的兼毫笔(羊毫加狼毫),从砚台上蘸墨,画在未上胶矾的生宣上,墨一碰纸就被吸进去。什么都不修改,什么都不覆盖:每一笔都是一个动作,只落一次。
笔触。 一支由真实毛发组成的笔(工具集里的 brush())。每根毛带着自己的墨量,随着行笔消耗,边缘的毛先耗尽。墨饱时,毛合成一道实心的笔触;墨将尽时,在纸占上风的地方毛就跳过去,于是出现飞白:顺着笔势走的露白条纹,以及提笔时散开的分叉笔毛。笔是一个圆锥:外圈的毛落得晚、抬得早,所以笔画两端是尖的或圆的,绝不是方的。
边缘。 湿的地方柔和,带羽状的晕散:在每个慢下来的点(落笔、在竹节处的停顿、提笔),墨渗进纤维,形成一圈晕,细细的羽毛状纹路向外洇开。干的地方破碎、起毛。wet > 0 时把一笔落在潮湿的纸上,整条边缘都会变柔(麻雀腹部的淡墨)。永远没有勾出来的轮廓线。
色调。 只靠加水稀释,即五种墨色:焦(1)、浓(0.82)、重(0.6)、淡(0.38)、清(0.2)。稀释后的墨略微偏冷,绝不发褐。单独一笔永远不会和自己叠加(它先渲染成一道不透明的笔触,再按它的色调铺上去);只有第二笔和第一笔交叉的地方墨色才会变深,这就是为什么叠在一起的竹叶会显出颜色更深的菱形。
顺序。 《芥子园画谱》的顺序:先画竿,每一节都用一笔向上画成,一次一节,笔在每个竹节处停顿、提起(底部的节短,竿中段的节最长);竹节用更深的墨;枝从节里生出;竹叶成组,用按下再提起的笔法画,前面的叶用浓墨,后面的叶用淡墨;鸟按画谱里的顺序画(喙、眼、头、背、翅、尾、腹、足);干笔点缀(草的挑笔、苔点);最后盖印。
调色板。 一锭墨,五种浓淡,一方朱砂印(#b8352b,正片叠底,印上的字是刻凹进去的,所以印出来是纸的颜色)。印上的字是杜撰的篆书记号,不是文字。
纸。 暖色、未漂白的宣纸 #f3ede0,长长的抄纸纤维和树皮碎屑作为几何图形画进底色,paper 以 0.1、coldpress 以 0.045 正片叠底在一切之上。没有纸面颗粒(tooth)。
和最近的近邻(wren,钢笔淡彩)不同。 Wren 先上淡彩颜色,再用软笔尖沿着形体勾一圈线;水墨既没有线也没有颜色:形体就是笔触,一片叶子一个动作,色调只来自稀释。Wren 的淡彩积在形状的底边;水墨的墨在笔行进路径上的慢点处洇开,并沿着笔画的长度方向干成飞白。
运动语法。 影片就是这幅画被画出来的过程:一笔以手的速度沿路径生长(长的竿节快,画鸟的笔画慢一些),笔离开之后,慢点处还在继续往外洇(晕圈在几帧之内扩大),两遍之间停一拍,印章短促地一下按上去。没有任何东西是淡入或缩放进场的。
工具集原语(可提升进核心的候选)。 runProcess + timeline(一张静帧,在一个只增不减的已完成缓存之上,以定时操作的形式把自己画出来)和 brush(毛发模型的笔触,带墨量、飞白和纤维洇散)。基于它们构建的影片应当设置 meta.raster: "cpu":否则多出来的那张缓存画布会迫使 Chromium 混用 GPU 栅格化和软件栅格化,帧在不同的渲染顺序下就不再一致。