纸张材质与笔触模拟技术:从贴图叠加到程序化生成
速览:水彩的两条命脉是纸纹和笔触——手工扫描给你真实,程序化生成给你产能,会用的人懂得按资产类型分着用。
水彩之所以「像水彩」,一半靠纸,一半靠笔
很多团队能写出一套让颜色正确晕开的 Shader,画面却始终「不太像水彩」。问题往往不在光照模型,而在两个更底层的东西:纸张的纤维纹理,以及笔尖留下的湿边与飞白。这两者构成了水彩的触觉记忆——观众未必说得清,但一眼就能察觉「不对劲」。
本文讨论这两类纹理的两条获取路径:手工扫描与程序化生成。它服务两类读者:想快速搭起资源库的初学者,以及要设计可复用材质体系的技术美术。
两条路径的本质差异
先给判断框架。手工扫描与程序化生成,不是「先进替代落后」的关系,而是适用场景不同的两种工具。
| 维度 | 手工扫描 | 程序化生成 |
|---|---|---|
| 真实度 | 高,包含真实的纤维与颜料沉积 | 中,取决于噪声模型与合成层数 |
| 产能 | 低,受限于扫描与修图工时 | 高,一次写好多处复用 |
| 可控性 | 低,一旦定稿难以调整 | 高,参数实时可调 |
| 体量 | 大,受分辨率与张数限制 | 小,靠计算而非存储 |
| 风格一致性 | 易漂移,每张纸都不同 | 易统一,同一套参数产出同一种纸 |
一句话选型:质感要求高且用量少的资产(封面、关键场景)用手工扫描;用量大、需要参数化调整的资产(可交互场景、程序化生成的地形)用程序化。真正的问题从来不是「选哪个」,而是「在哪一层用哪个」。
纸张纹理:获取与处理
纸张纹理决定了颜料的沉积方式与边缘的破碎感。同样是水彩,粗纹纸、中纹纸与细纹纸呈现的晕染形态完全不同——粗纹会形成明显的颗粒沉积,细纹则接近平滑的渐层。
手工扫描路线
基本流程是:选纸 → 用纯水或淡色扫一遍让纤维立起来 → 高分辨率扫描(建议光学分辨率尽可能高、避免过度的降噪算法介入)→ 转成灰度高度图 → 作为法线或位移输入。要点在于「保留噪声」:扫描后的自动降噪会把最有价值的纤维细节一起抹掉,宁可保留一些瑕疵。
程序化生成路线
程序化纸纹通常由多层噪声叠加而成:低频噪声提供大块的明暗起伏,高频噪声模拟纤维的细密纹理,再叠加一层方向性噪声模拟纤维的方向偏好。关键在于「多尺度混合」——单一频率的噪声看起来会像电子噪点而非纸张。
常见坑:把纸纹当成一张固定的「叠加贴图」平铺在整个画面上。真实的纸纹会随视角、光照方向、颜料湿度变化,固定平铺会让画面显得像贴了一张纸的膜,而不是画在纸上。更好的做法是把纸纹作为调制层,参与颜料的沉积计算。
笔触贴图库:分类与管理
笔触贴图是水彩的「手写签名」。一个有体系的笔触库,能让团队在不增加 Shader 复杂度的情况下,显著提升画面的丰富度。
建议按三个维度组织笔触库:
- 按含水率:干笔(飞白、枯笔)→ 半干 → 湿笔(大面积晕染)。不同含水率决定边缘是「毛躁」还是「柔化」。
- 按形状:圆头、平头、扇形、点状。扇形笔用于过渡,平头笔用于块面,圆头笔用于勾线。
- 按用途:铺色、叠色、点缀、破坏(制造随机斑驳)。这一维度最贴近实际生产,建议作为主索引。
管理上,把笔触贴图组织成图集并配合 UV 索引,可以在保持笔触多样性的同时维持材质统一——这对后续的合批与性能优化至关重要。
架构提示:让笔触库成为「数据」而不是「硬编码」。用一张配置表描述每个笔触的含水率、形状、尺寸范围,Shader 与工具都从这张表读取。这样美术加一个新笔触不需要改代码,技术美术调一个新参数不需要重新导出资源。
程序化噪声参数如何影响最终效果
程序化方案的可控性来自参数,但也意味着「调参」成为一项核心工作。下面这张表总结了主要参数的作用方向,可以作为调参的起点。
| 参数 | 作用 | 调高的效果 | 典型误区 |
|---|---|---|---|
| 频率(Frequency) | 控制纹理的疏密尺度 | 纹理更细密 | 过高会像噪点,失去纸感 |
| 层数(Octaves) | 控制细节的丰富度 | 细节更多、更自然 | 层数过多显著增加采样开销 |
| 对比度(Contrast) | 控制纹理的强弱 | 纸纹更明显 | 过强会让画面显得脏 |
| 方向性(Anisotropy) | 控制纤维的方向偏好 | 纤维方向感更强 | 方向与画面构图冲突会显突兀 |
| 湿度(Wetness) | 控制晕染扩散的强度 | 边缘更柔、扩散更远 | 过高会糊掉形体轮廓 |
调参的核心原则是「保守起步、单项推进」:每次只改一个参数,观察它对画面的影响,避免多参数同时调整导致无法归因。
混合策略:让两条路径在同一个画面里共存
成熟的团队很少二选一,而是让两条路径在同一画面里各司其职。常见组合是:程序化生成负责「大面积、可重复」的底层质感(纸纹、基础笔触分布),手工资产负责「小面积、高辨识」的点睛部分(角色面部笔触、场景的视觉焦点)。
这样做的技术前提是两套资产的「接口」要对齐:颜色空间一致、纸纹尺度一致、笔触的含水率与边缘特征一致。接口不对齐时,画面会出现明显的「两个世界拼接」感,这正是许多混合方案失败的根本原因。
一分钟速览:初学者的最小可行资源库
不想一开始就投入大量扫描与调参,可以先用这套最小组合跑起来:
- 扫描或下载三张纸纹(粗、中、细各一张),转成灰度高度图。
- 准备八到十二个笔触贴图,覆盖干笔、湿笔、铺色、点缀四类用途。
- 先用固定纸纹 + 少量笔触搭出画面,再逐步用程序化生成替换可重复的部分。
中级路径:把纹理体系做成可扩展资产
有经验的技术美术应当把纹理从「一堆文件」升级为「一套体系」,核心是三个决定:
决定一——分层职责。明确哪一层用扫描、哪一层用程序化,并在文档里固定下来。混合方案的失败往往不是技术问题,而是职责不清导致的接口漂移。
决定二——参数外置。所有可调参数(频率、层数、湿度等)都通过配置表暴露,而非写死在 Shader 中。这是让美术能独立迭代、工程师能快速调试的前提。
决定三——性能预算。程序化纹理的采样开销与层数成正比,务必为它设定预算上限,并准备低配降级方案(减少层数、用预烘焙贴图替代实时计算)。
常见坑:为了追求极致的纸纹真实度而无限增加噪声层数,结果在移动端直接掉帧。记住:观众感知到的是「像不像纸」,而不是「纸纹有多少层」。超出感知阈值的复杂度是纯浪费。
争议观察:程序化生成的纹理是否会导致画面「千篇一律」
一种批评认为,程序化方案产出的是「统计意义上的平均水彩」——它复现了水彩的一般规律,却缺少人为的偶然与失误,长期看会让大量作品趋于同质。另一种看法是,同质化的根源不在程序化本身,而在创作者是否愿意投入时间去调参和做差异化设计;工具不会限制表达,懒惰才会。
我们的判断偏向后者,但要补一个限定:程序化确实降低了「做出合格水彩」的门槛,也因此提高了「做出被记住的水彩」的难度。当所有人都能用一套开源 Shader 得到相似的纸纹与晕染时,真正的差异化必然回到两处——一是笔触的个性化设计,二是这些笔触如何服务于具体的叙事与情绪。技术会把地面抬高,但天花板仍由审美决定。
常见问题
纸纹应该作为叠加贴图还是作为调制层?
建议作为调制层。固定平铺的叠加贴图会让画面像贴了一张纸的膜,因为它不随视角、光照与颜料湿度变化。让纸纹参与颜料的沉积计算,才能真正形成「画在纸上」的观感,代价是 Shader 会稍复杂一些。
程序化噪声层数越多越好吗?
不是。层数增加会带来细节提升,但也成倍增加采样开销,而且超出感知阈值后玩家根本看不出差别。建议按目标平台设定层数上限,并为低配准备降级方案(减层或用预烘焙贴图),把省下的算力留给更影响观感的环节。
手工扫描和程序化生成可以混用吗?
可以,而且是成熟团队的常见做法。关键前提是两套资产的接口要对齐——颜色空间、纸纹尺度、笔触含水率与边缘特征都要一致。接口不对齐会出现明显的拼接感,所以建议在美术规范里就把分层职责写清楚。