项目概述
这个程序化石材表面材质用于覆盖建筑外墙与地面铺装,需要在四种不同的铺装变体之间无缝切换,同时保持 2K 输出的内存开销。整个 Graph 包含 68 个节点,生成时间控制在 4 秒以内。
与手绘材质不同,程序化材质的价值在于参数化能力:一块石材的定义不应该是一张贴图,而是一套可以被调用的规律。因此本项目的验收标准不是“看起来像石头”,而是“在不同参数下都像合理的石头”。
参考分析
参考阶段收集了四类石材的实拍照片:花岗岩、砂岩、板岩与石灰华。每类记录三项数据:颗粒尺寸区间、裂缝走向规律、风化层的厚度与色彩偏移方向。
参考分析的核心结论是:石材的视觉特征主要由“裂缝网络”与“颗粒尺度”两组信息决定,而这两组信息都可以用噪声叠加与方向模糊来表达,不需要依赖任何位图素材。
高度优先原则
整个 Graph 以高度图为唯一起点,法线、AO 与曲率全部由高度生成,基础色与粗糙度则从高度与曲率派生。这个顺序保证了所有通道之间的一致性,修改任何一个参数都不会出现通道不同步的问题。
高度图的第一层是石材的基本单元划分,使用 Voronoi 生成并加入边缘扰动,让单元边界呈现自然的不规则性。第二层是单元内部的高低差,第三层才是颗粒与风化细节。
形状与噪声
噪声的选择遵循尺度分离原则:大尺度使用 Directional Warp 处理过的 Perlin 噪声表达整体起伏,中尺度使用 Cells 表达颗粒团块,小尺度使用 Grunge 表达表面粗糙。三层噪声的频率至少相差四倍,避免出现视觉上的混叠。
三层噪声的分工
- 大尺度:决定石材整体的隆起与凹陷走向
- 中尺度:决定颗粒团块的尺寸与分布密度
- 小尺度:决定近距离观看时的表面质感
方向性通过一个统一的 Warp 节点注入,参数暴露为“层理角度”,这让同一套 Graph 可以在花岗岩(无方向)与砂岩(强方向)之间切换,而不需要维护两套节点网络。
表面细节与破损
破损细节集中在石材边缘:使用曲率遮罩提取单元边界,再叠加一层细裂缝噪声,让边缘出现自然的崩缺。崩缺的深度由“风化强度”参数控制,范围从几乎不可见到明显残缺。
孔洞与沉积是第二类细节,主要针对石灰华与砂岩变体。孔洞使用 Cells 加阈值处理生成,沉积则通过高度图的低洼区域遮罩叠加一层浅色物质,两者互斥以避免出现不合理的重叠。
所有细节层的强度都被限制在高度总范围的 15% 以内。这个上限来自多次测试:超过之后法线在掠射角下开始出现自阴影丢失,石材会呈现出塑料般的反光。
粗糙度与输出
粗糙度由两部分构成:颗粒本身的高粗糙基底,以及低洼处的潮湿与积尘降低粗糙度。后者通过高度图反转加模糊实现,让石材在雨后呈现出真实的局部反光差异。
粗糙度不是基础色的附属品,它决定了石材在掠射光下是否还能读出颗粒。
输出阶段统一使用 2K 分辨率,法线采用 OpenGL 标准并关闭归一化以保留细节强度。四种铺装变体通过一个 Switch 节点切换单元划分方式,共享其余全部节点。
Graph 优化与总结
Graph 优化围绕两个方向:一是合并重复的噪声计算,将原本 14 个独立噪声源压缩为 6 个共享源加参数分支;二是把高分辨率计算推迟到最后一层,中间过程统一使用 512 分辨率预览。
优化后生成时间从 11 秒降至 3.8 秒,节点数量从 92 个精简到 68 个,而输出质量在盲测中没有被察觉差异。性能与可维护性在这类项目中往往来自同一次重构。
这套材质的真正价值在于它是一个可复用的思考模板:先定义规律,再选择噪声,最后才谈细节。同样的结构可以直接迁移到砖墙、混凝土与铺路石等其他程序化表面。