8 为什么要补全
📐 设计 —— 这一部没有实现,没有实测数据。写的是问题、接口和验收标准。
问题
拆分出来的部件是被遮挡过的。Skin_Torso 被手臂和裙子挡住,它的 mask 是「露出来的那部分」,不是躯干的完整形状。Hair_Back 被 Hair_Front 和脸挡住。
在叠层时这会露出来:
- 图层顺序改不动。 画师想把手臂移开一点,底下的躯干是空的。
- 接缝依赖遮挡关系。 现在靠
expand=0.6让上层压住下层,如果下层根本没画到那里,扩张也没用。 - 局部重绘没有底。 后续 AI 要重画手臂,它挪动之后露出的躯干区域没有内容。
一张真正可编辑的分层原画,每一层在被遮挡的地方也该是画完整的——这正是画师的做法:先把躯干整个画完,再在上面画手臂。
补什么、不补什么
补:部件被其他部件遮挡的区域,在遮挡边界向内一个合理深度(建议 ≤ 部件等效半径的 40%)。
不补:
- 部件被画框裁掉的部分(画布外没有真值,也不需要)
- 背景(它已经是铺满整幅的,见第 12 章)
- 遮挡太深的区域(躯干被裙子挡住的下半身——补出来的东西没有任何约束,是编造)
在流程里的位置
拆分 (4–7) → 补全 (8–11) → 叠层 (12–16)
│
└─ 输入: 每个部件的 mask / α / 色阶 / 周边上下文
输出: 补完整的部件 RGBA, 以及重新解出的 α 边界
补全的输出要重新走一遍第 5 章和第 7 章——新的边界要解 α、要矢量化。所以补全模块的产出格式和拆分的中间产物一致,下游不需要知道有没有补过。
这一部的状态
本书完成时 ./paint trace 直接从拆分跳到叠层,跳过补全。所有实测数字都是在没有补全的前提下量的。补全实现之后,第 15 章的判据不应变差;如果变差了,是补全引入的。