作者及机构
本研究的核心团队由Beichen Li(MIT CSAIL)、Rundi Wu(哥伦比亚大学)、Armando Solar-Lezama(MIT CSAIL)、Changxi Zheng(哥伦比亚大学)、Liang Shi(MIT CSAIL)、Bernd Bickel(ETH Zürich/谷歌研究院)和Wojciech Matusik(MIT CSAIL)组成。研究成果以《VLMaterial: Procedural Material Generation with Large Vision-Language Models》为题,发表于ICLR 2025会议。
研究领域与动机
程序化材质(Procedural Materials)是计算机图形学中通过节点图(Node Graphs)生成逼真材质外观的核心技术,广泛应用于游戏、影视和AR/VR领域。传统基于图像的材质(Image-based Materials)存在分辨率限制和难以编辑的问题,而程序化材质通过参数化节点图实现可解释、可控且分辨率无关的表示。然而,从单张输入图像生成程序化材质需要专业知识和大量人工操作,这促使研究者探索逆向程序化材质建模(Inverse Procedural Material Modeling)方法。
研究目标
本研究旨在利用大视觉语言模型(VLM)的生成能力,通过微调预训练模型,直接从输入图像生成Blender软件中的程序化材质代码(Python格式),解决现有方法依赖定制化网络或商业软件(如Adobe Substance 3D)的局限性。
1. 数据集构建与增强
- 原始数据收集:从BlenderKit、InfiniGen和第三方材质包中收集3,663个艺术家创建的程序化材质,经过节点图清理(删除冗余节点、限制节点数≤30)和代码验证(剔除渲染质量差的材质),最终保留1,640个高质量样本。
- 数据增强策略:
- 程序结构增强:基于FunSearch方法,利用GPT-4o-mini对870个复杂材质进行“基因交叉”,生成50,400种新结构(30倍于原始数据)。
- 参数空间增强:对节点参数(连续/离散)随机扰动,扩充至55万样本(330倍于原始数据)。
2. 模型微调
- 基础模型:采用LLaVA-Next(基于CLIP ViT-L/14视觉编码器和LLaMA 3 8B语言解码器),通过LoRA(低秩适配器)微调注意力层(参数量40M)。
- 训练配置:使用AdamW优化器(学习率1e-4)、BF16精度,在8×NVIDIA H100 GPU上训练5个epoch,批次大小为32。输入为图像与提示词组合:“Write a Python function with Blender API to create a material node graph for this image.”
3. 后优化算法
采用马尔可夫链蒙特卡洛(MCMC)方法对生成材质的节点参数进行局部搜索:
- 采样策略:每次迭代仅扰动10%的参数,连续参数在±20%区间均匀采样,离散参数以20%概率调整。
- 目标函数:基于Gram矩阵的感知损失(Perceptual Loss),迭代200次,以5%概率接受较差解以避免局部最优。
1. 定量对比
在Blender(同分布)、Substance(跨分布)和真实图像测试集上,本文方法均优于基线(GPT-4o-mini、Conditional MatFormer等):
- Blender测试集:风格损失(Style Loss)0.019(最佳),程序正确率91.1%;
- Substance测试集:CLIP相似度0.762,显著高于GPT-4o-mini(0.680);
- 真实图像:程序正确率87%,证明强泛化能力。
2. 定性分析
生成材质在3D场景中可直接应用(图1),且支持参数编辑(如调整节点颜色或连接方式)。例如,对木质纹理的粗糙度参数微调后,可快速匹配不同光照条件下的目标外观。
3. 消融实验
- 结构增强:移除后风格损失上升72%(Blender测试集从0.019→0.032);
- 参数增强:移除后程序正确率下降至60.3%(原为91.1%);
- 后优化:MCMC进一步降低风格损失15%(从0.019→0.015)。
科学价值
1. 方法创新:首次将VLM微调技术应用于程序化材质生成,提出程序级数据增强策略,解决了训练数据稀缺问题。
2. 开源贡献:发布首个Blender程序化材质开源数据集(55万样本),推动逆向图形学研究。
应用价值
- 艺术家工具:生成材质可作为编辑起点,节省70%以上手工建模时间(用户研究评分6.8/10);
- 跨平台兼容性:生成的Python代码可直接在Blender中执行,规避商业软件依赖。
未来方向
包括结合强化学习优化视觉反馈、设计领域专用语言(DSL)压缩代码长度,以及引入语法检查器确保程序正确性。