Paper Reading · arXiv:2604.26943v2 · 15 Sep 2026

ProcFunc

Function-Oriented Abstractions for Procedural 3D Generation in Python
Blender Procedural Generation Procedural Materials Image to Program VLM Code Editing Static Program Tracing Synthetic Data 相关度:高

一句话抓住这篇论文

ProcFunc 的核心不是训练一个新的图像到材质模型,而是重新设计 Blender procedural generation 的程序表示。 作者把 GUI 导向、依赖隐式全局状态的 Blender 操作,重构成 497 个显式输入输出的 Python 原子函数, 再用标准化 module interface、可复现随机采样和静态 program tracing, 把材质、几何和场景都变成更适合人类与 VLM 读写、组合、分析和优化的程序。

497
Python primitive functions

覆盖常见 Blender procedural material 与 mesh editing 操作。

35
新建 procedural material components

包含 base materials、shape modules 与 wear masks。

6+
material modularity levels

作者称其材质组合层数达到六层以上,而 Infinigen 最多约两层。

对 Procedural Material Generation 最重要的结论: ProcFunc 把“材质图是什么表示”从一个工程细节提升成了模型性能变量。 在 from scratch material creation 中,仅仅换 API 和程序表示,就显著降低 VLM coding error。 这意味着未来的 image to procedural material 工作,不应只比较模型本身,也应该系统研究 graph IR、API abstraction、context length、可追踪参数空间和可执行反馈。
版本说明: 今天 arXiv 列表中出现的是 v2 replacement,不是今天首次发布的新 v1。 论文最初于 2026 年 4 月 29 日提交,v2 于 2026 年 9 月 15 日更新。 因此今天的意义是“重要更新重新进入列表”,而不是“全新论文首次出现”。

研究动机:真正的瓶颈可能是程序接口

Blender API 为什么不适合程序化研究

Blender Python API 很大一部分是为 GUI workflow 服务。一个操作经常依赖当前选中对象、当前 mode、动态 socket 索引和全局 background state。对艺术家而言这些交互很自然,但对 LLM 或程序组合而言,这些隐式依赖会让代码脆弱。

作者借鉴的是 PyTorch 与 JAX

论文希望 procedural graphics 像 neural network programming 一样,使用显式、原子、可组合的函数构建 compute graph。模块应该有标准输入输出,随机性应该显式,程序还应该可以被 trace、分析和重新生成。

这篇论文的一个重要观点是,程序表示会直接决定 AI agent 的可用性。如果一段 node graph 转成 Python 后充满 UI key、全局状态和样板代码,即便模型有很强视觉推理能力,也会浪费大量推理预算在 Blender 的偶然复杂性上。

复杂 Blender 状态
→
ProcFunc 原子 API
→
更短、更显式、可组合的程序

表示设计:把 procedural generator 当作函数系统

1. 原子操作

作者将每个 graphics operation 表示为一个 Python function。函数的依赖全部显式写入参数,所有效果通过返回值暴露。运行时自动进行 datatype inference,并允许算术 operator 根据输入类型映射到 shader 或其它算术操作。

可以把一个 deterministic generator 抽象为:

\[ y = G(\theta,c), \]

其中 \(\theta\) 是公开的 procedural parameters,\(c\) 是 coordinate、geometry 或上游 module 输出。对 material module,论文规定一个重要的标准接口:输入包含 vector 坐标,输出包含 surface、displacement 和 volume。

2. 随机 generator 与 deterministic generator 分离

随机版本显式接收 np.random.Generator。因此随机 generator 可以写成:

\[ \theta \sim p_{\psi}(\theta;r), \qquad y = G(\theta,c), \]

其中 \(r\) 是显式 RNG state。这个设计同时保证 seed reproducibility,并阻止 deterministic module 在不可见位置偷偷引入随机性。

3. Nodegraph transpiler

论文提供 Blender Nodegraph 到 ProcFunc Python code 的 transpiler。它会进行 expression inlining、operator overload、HSV color 后处理和 example parameter interpolation。因此已有 GUI nodegraph 可以被转成适合 LLM 编辑的 Python representation,而不是要求模型从零理解 Blender 的 UI state。

这点与你做 Substance Designer 很接近。 一个很自然的对应关系是:SBS node graph 保留为 canonical executable asset,同时建立一个面向 agent 的简洁 DSL 或 Python IR。 模型在 IR 上搜索和修改,系统负责把 IR 编译回 SBS graph。

Tracer:这可能是整篇论文最值得 PMG 借鉴的部分

随机 procedural generator 的参数通常藏在函数内部,所以“代码可执行”不代表“参数空间可分析”。ProcFunc 引入类似 JAX tracing 与 torch.fx 的 tracer,在特殊 execution context 中运行程序,但不执行昂贵 graphics computation,而是记录 compute graph。

三类 trace 语义

Grammar trace

只保留最高层函数调用。适合得到一个简洁的生成脚本骨架,也适合让 agent 从结构级 context 开始修改。

Control trace

捕获全部可能的随机 control paths,即使当前 seed 没有实际走过某条 branch。它描述的是整个 generator distribution,而不是单一实例。

Params trace

只保留当前 execution path 的 active parameters。适合对当前实例做连续参数优化,同时保持参数仍位于原生成分布支持范围内。

Specific instance graph

随机选择被 materialize 成具体数字,得到与某一张 render 精确对应的程序。作者明确指出,这类 image code pair 可作为 image to program 和 inverse procedural generation 的训练监督。

如果把 generator 的完整随机程序记为 \(\mathcal{P}\),control trace 可以看成提取:

\[ \mathcal{T}_{\mathrm{ctrl}}(\mathcal{P}) = (V,E,\mathcal{B},\mathcal{D}), \]

其中 \(V\) 是函数与参数节点,\(E\) 是数据依赖,\(\mathcal{B}\) 是离散 control branches,\(\mathcal{D}\) 是连续或离散随机分布。某个 seed 对应的 instance trace 则是这个 distribution graph 中的一条具体可执行路径。

这对你的研究有一个直接价值: ProcFunc 已经把 procedural graph 分成了“distribution level”和“instance level”两种结构。 你的 image to material graph 可以不必只预测一个固定 graph。 更强的目标是预测一个 distribution level generator,再由具体 reference image 约束出 instance trace。 这样能够同时获得单图重建能力和可随机化的材质族。

材质系统:不是一堆独立 preset,而是组合式生成空间

作者提供 35 个新 procedural material components。核心类别如下。

类别组件角色
Material BaseConcrete, Ceramic, Metal, Fabric, Glass, Granite, Gravel, Marble, Paint, Plastic, Stone, Terrazzo, Wood基础物理和视觉材质族
Material ShapesTiles 10 variants, Bricks 4 variants, Masonry, Planks建立可重复中尺度结构
Material MasksCracks, Flakes, Smudges, Dirt, Scratches, Edge Wear增加局部磨损、污染和非均匀性

真正的贡献不是组件数量,而是 compositional interface。Base、shape 与 overlay 可以任意组合,形成成千上万甚至数万种语义上有效的组合。作者还构造了“maximum diversity composition”,展示从 Base 到 Base + Shapes,再到 Base + Shapes + Overlay 后,参数数量和组合数量快速增长。

ProcFunc Figure 40 maximum diversity composition
论文真实 Figure 40。图中分别展示 Base、Shapes、Overlay Masks 及其多层组合。 作者用它说明 compositional procedural materials 如何从有限 modules 扩展为巨大的结构化生成空间。

计算图层面的多样性

StrategyContinuous Params.Discrete Params.Cyclomatic ComplexityEntropy bits
Base Materials25.51.804581.3
Multi-level Composition41.73.71448134

连续参数在计算 entropy 时被离散为 3 bits。这里的数字不能直接理解为视觉 diversity 的绝对尺度,但它非常适合比较同一 generator family 在引入 composition 前后的搜索空间扩展。

Surface detail

材质不仅修改 shader,还可以组合 per vertex displacement。作者用局部 normal variation 描述表面几何细节:

\[ V_i = \sum_{j\in N(i)} \angle \left( \mathbf{n}_i,\mathbf{n}_j \right), \]

其中 \(N(i)\) 为以 pixel \(i\) 为中心的 \(15\times15\) neighborhood。统计来自每个数据集 500 张图的有效 pixels。这个指标说明 ProcFunc 的 material representation 可以产生真实几何细节,而不仅是 flat color texture。

VLM 实验:API 本身能否影响材质生成能力

实验 A:已有程序的参数编辑

模型获得当前代码、当前 render 和 goal render。每轮需要先判断最明显的视觉差异,再定位最可能负责该差异的 numeric fields,然后修改参数。总共进行 4 轮 sequential editing and rendering。

评价指标沿用 BlenderGym:

\[ \mathrm{PL} = \frac{1}{|\Omega|} \sum_{x\in\Omega} \left\| I(x)-I^{\ast}(x) \right\|_2^2, \] \[ \mathrm{NCLIP} = 1- \frac{ f(I)^{\mathsf{T}}f(I^{\ast}) }{ \lVert f(I)\rVert_2 \lVert f(I^{\ast})\rVert_2 }. \]

Geometry task 另外使用 10,000 point point clouds 计算 Chamfer Distance。PL、NCLIP 和 CD 在论文表格中按 BlenderGym 约定缩放 \(10^2\)。

API Materials Geometry
PL ↓NCLIP ↓Error ↓Cost USD ↓ PL ↓NCLIP ↓CD ↓Error ↓Cost USD ↓
Infinigen average5.2411.281.3%5.276.2810.242.255.43%2.68
ProcFunc average3.799.432.1%4.626.119.511.615.40%2.83

参数编辑中 ProcFunc 的材料视觉指标更好,但 error rate 并没有统一更低。作者也强调这个 setting 其实不完全发挥 ProcFunc 的优势,因为任务只修改已经存在的数值参数,不需要新增结构。

实验 B:从零生成 procedural material

这是与你当前方向更接近的实验。作者去掉 starter material code,只提供 goal render,允许模型添加 nodes 并从零构造程序。为了提高难度下的稳定性,进行 8 轮交互,并额外提供 API documentation 和 5 个完成的 in context examples。

ModelAPIPL ↓NCLIP ↓Error ↓Cost USD ↓
Gemini 2.5 ProInfinigen4.3710.5630.3%28.60
Gemini 2.5 ProProcFunc3.9510.144.9%15.08
GPT 5.2Infinigen5.0911.9244.7%38.81
GPT 5.2ProcFunc4.4911.5121.4%34.21
最值得引用的实验结论: Gemini 2.5 Pro 的 coding error 从 30.3% 降到 4.9%,GPT 5.2 从 44.7% 降到 21.4%。 这并没有证明 ProcFunc 已经解决 image to material,但它非常有力地说明 结构化 API 与 IR 会显著改变 VLM 在 procedural material synthesis 中的执行可靠性。

Prompt 设计

Appendix C 给出了完整 prompt templates。Parameter editing prompt 强制模型只修改 parameters,并先回答“当前 render 与目标最明显的一个视觉差异是什么”,再定位相关 numeric variables。From scratch prompt 则明确要求关注 base color、patterns、textures 和 details,并限定只使用 ProcFunc API。

概念化流程
输入:goal render + 当前 code 或最小 starter
1. 识别最显著视觉误差
2. 定位相关参数或结构
3. 输出完整可运行 Python
4. Blender 执行并渲染
5. 下一轮继续比较
论文自己明确说明,这不是 state of the art agent harness。 实验目的只是隔离 API representation 的影响。 因此不能把 Table 1 或 Table 2 当作“最佳 image to procedural material 系统”的横向排名。

程序化场景效率、合成数据与可扩展性

ProcFunc 不只提供材料 API,还用这些 components 搭建了新的 indoor room generator。作者比较 Infinigen Indoors 与自己的 scene pipeline,并分别测试是否加入 objects 和 high polygon detail。

SettingMethod#Tris#ObjsScene CPUMemoryRender first + laterStorage
Low complexityInfinigen0.37M22.90.46 min1.2 GB7.6 + 2.67 s0.35 GB
Low complexityProcFunc0.02M18.50.02 min0.41 GB10.4 + 8.01 s0.16 GB
High polyInfinigen49.1M22.7276 min15.07 GB938.1 + 3.82 s3.78 GB
High polyProcFunc35.4M18.50.02 min2.53 GB25.8 + 8.49 s0.16 GB
Objects + high polyInfinigen55.7M30.6278.98 min15.94 GB356.6 + 3.66 s4.39 GB
Objects + high polyProcFunc43.4M60.11.1 min4.743 GB30.7 + 8.79 s0.43 GB
ProcFunc resource usage histograms
论文真实资源使用图。ProcFunc 的 Scene CPU、scene generation memory 与 disk usage 分布明显更集中。 作者同时提醒,复杂 shader program 使部分 render time 并不一定优于 Infinigen。

Stereo dataset 验证

作者生成 50,000 对 stereo images。场景生成时间约 0.41 min,而参考 WMGStereo pipeline 约 13 min,约快 31 倍。随后用标准设置训练 RAFT Stereo 75k steps,使用 2 张 NVIDIA A6000。

DatasetSizeMiddlebury full EPE ↓Middlebury half EPE ↓KITTI15 EPE ↓ETH3D EPE ↓Booster EPE ↓
SceneFlow40k4.371.712.590.303.77
CREStereo200k5.282.091.190.282.67
TartanAir306k10.72.171.090.353.89
FSD1M1.670.831.030.292.04
ProcFunc50k2.231.161.060.281.42

作者没有宣称 stereo state of the art。这里的目的只是证明,一个相对简洁的 procedural generator 已经能够产生具有实际训练价值的 synthetic distribution。

Appendix 中对复现最重要的内容

A.3 High Realism Materials

给出大量随机材质样本,包括 bricks、concrete、fabric、glass、granite、marble、paint、plastic、stone、terrazzo、tile、wood 等,并展示多层组合。

A.4 Material Implementation Examples

直接展示 Infinigen 与 ProcFunc 的材质 Python 实现差异。ProcFunc 使用类似 pf.nodes.shader.noise、voronoi、color_ramp 等显式函数。

B.1 Tracer Implementation

Tracer 使用 Proxy 代替真实 graphics values,在执行代码的同时记录函数调用、随机分布、branch 与参数,因此可以输出 grammar、control、params 和具体 instance program。

B.2 Room Generator

详细说明 wall geometry、object generators、collision、ground truth 以及 RRT star camera trajectory。场景工具不是论文主体,但对 synthetic data 复现很重要。

C.1 Exact Prompt Templates

提供 ProcFunc 与 Infinigen 两个 backend 的 parameter edit prompt 和 from scratch prompt。由此可以比较 API representation,而不是猜测不同 prompt 导致结果。

C.3 Efficiency Hardware

场景生成 benchmark 使用 Intel Xeon Gold 5320 CPU cores,rendering 使用 NVIDIA L40。Infinigen pipeline 不同阶段分成多个 jobs,作者同时报告 ground truth render runtime。

一个需要透明说明的限制: arXiv PDF 文件约 18 MB,本次在线 PDF 端点因文件大小限制无法在工具中直接载入页面截图。 因此本页深度解析基于完整 arXiv v2 HTML 正文、全部 HTML appendix、表格和可访问的论文原图。 没有把无法取得的 PDF 页面视觉信息伪装成已检查内容。

Reviewer 视角

强项

表示层贡献非常实际。很多 LLM graphics 工作把失败归因于模型不够强,但 ProcFunc 表明 API 的隐式状态、代码长度和函数语义本身就是重要瓶颈。

与 AI agent 高度兼容。所有参数显式、函数原子化、nodegraph 可 transpile、程序可 trace,这些设计天然适合 tool use、code generation、search 和 optimization。

Instance graph 与 distribution graph 的区分很有研究价值。它允许同一表示同时服务单图重建和数据分布建模。

Appendix 可复现性较强。v2 HTML 给出 prompt templates、程序 trace、材质实现例子和效率细节,远比只报告最终 metric 更有用。

不足

不是一个新的 inverse procedural model。核心贡献是 library 和 representation。VLM 仍然使用简单 sequential edit harness。

from scratch evaluation 仍是已知可重建的 BlenderGym synthetic targets。这有助于可控比较,但没有证明在真实照片、复杂 lighting、未知材质族上的 image to graph 泛化。

指标仍然偏 render similarity 与 execution reliability。没有系统评价 graph topology correctness、semantic node correspondence、parameter identifiability 与 human editability。

ProcFunc 与 Infinigen 的先验分布并不对称。作者自己指出 commercial models 很可能见过 Infinigen,而 ProcFunc 是 zero shot。反过来,ProcFunc 更接近普通 Python,也可能天然更接近模型预训练分布。

组合空间很大不等于 perceptual coverage 同样大。134 bits entropy 和 448 cyclomatic complexity 衡量程序空间,不直接等价于视觉空间的有效多样性。

Reviewer intuition:8.5 / 10 for representation and tooling

如果作为“新的 procedural material generation algorithm”来评分,我不会给这么高。 但如果把问题定义为“怎样设计一个让人类和 AI 都能可靠生成、组合、追踪和优化 procedural assets 的中间表示”,这篇工作非常重要。 它填的是 infrastructure 和 representation gap,而这恰好可能决定后续 agent system 的上限。

它与当前 Procedural Material Generation 研究怎样连接

对于“reference image → Substance Designer graph”的目标,ProcFunc 最值得借鉴的并不是把 Blender 换成 Python, 而是建立一层面向模型的程序 IR,并使这层 IR 同时支持生成、执行、trace、搜索和监督学习。

1. 把 SBS graph 分成三层表示

Canonical SBS graph
→
Agent friendly IR
→
Trace and evaluation graph

Canonical graph 负责最终兼容 Substance Designer。Agent friendly IR 负责降低 context complexity。Trace graph 负责回答“哪些 node、哪些参数、哪些 branch 实际影响了当前 render”。

2. Structured visual context 应该与 program context 对齐

你目前考虑的 macro、meso、micro visual decomposition 可以进一步对应到 graph module hierarchy。例如:

Visual contextProgram contextAgent action
Macro structureMaterial base + large masks选择主要 graph branch 与 coordinate system
Meso patternTile, brick, plank, cells, warp modules建立重复结构、尺度与方向
Micro detailNoise, scratches, pores, edge wear增加高频 branch 与细节参数
Observed failureActive trace / attribution subgraph只把相关 program context 送回模型

3. 这可以把 Context Optimization 从文字 prompt 变成程序级机制

如果当前 render 为 \(R(G)\),reference 为 \(I^{\ast}\),传统 agent 每轮可能把整个 graph \(G\) 和整个 image 都重新输入模型。ProcFunc 式 trace 允许先找到与当前 failure 相关的 active subgraph:

\[ G_{\mathrm{act}} = \mathcal{T} \left( G, I^{\ast}, R(G) \right), \]

然后只构造局部 context:

\[ C_t = \left[ I^{\ast}_{\mathrm{region}}, R(G_t)_{\mathrm{region}}, G_{\mathrm{act}}, \theta_{\mathrm{act}}, E_t \right]. \]

其中 \(E_t\) 是结构化 evaluator feedback。下一轮 agent 只修改活跃子图:

\[ G_{t+1} = \operatorname{Edit} \left( G_t, A(C_t) \right). \]
这是一个很清楚的论文方向: 把 ProcFunc 的 program tracing 思想与 structured visual context 合并, 研究“visual error attribution → active material subgraph retrieval → context compression → local graph editing”。 与单纯 prompt engineering 相比,这里有明确的算法结构,也能直接测 context tokens、execution error、edit locality、graph validity 和 render improvement。

4. 最值得新增的 baseline

BaselineAgent context目的
Full Graph整张 reference + 完整 graph code最直接的 agent baseline
Visual Decompositionmacro / meso / micro context + 完整 graph验证 structured visual context
Program Trace Only完整 reference + active subgraph验证 program context compression
Joint Context局部 visual context + active subgraph + evaluator feedback验证 visual context 与 graph context 对齐是否带来额外收益

这样可以把你的研究问题从“模型能不能生成 Substance Designer graph”提升成更一般的命题:复杂可执行视觉程序应该如何被表示、分解和动态放入 agent context,才能在有限 test time compute 下可靠优化。

最终判断

ProcFunc v2 是本批次最值得 Procedural Material Generation 方向重点关注的工作。 它没有提出新的视觉 backbone,也没有解决真实照片到材质 graph 的完整 inverse problem, 但它非常直接地证明了一个常被低估的事实:程序表示本身就是生成模型的一部分。 当 API 更显式、更短、更可组合、更可 trace 时,同一个 VLM 能更可靠地生成和修改 procedural materials。

对你当前的 Context Optimization + Agent 路线,我认为最值得立即吸收的是三点: 一是设计 Substance Designer 的 agent friendly IR; 二是建立 instance level 与 distribution level material traces; 三是让视觉 decomposition 与 active program subgraph retrieval 对齐。 这三点组合起来,比单纯增加 prompt 长度或增加 agent search rounds 更容易形成清晰、可消融、可发表的方法贡献。

原论文: arXiv abstract  ·  arXiv v2 HTML  ·  Official code

重点位置:Figure 1 Primitives API;Figure 2 compositional procedural generation;Figure 3 room generator; Table 1 parameter editing;Table 2 from scratch procedural material creation;Table 3 efficiency; Table 4 analytical diversity;Figure 5 surface detail;Table 5 stereo dataset; Appendix A material galleries and implementation examples;Appendix B tracer and room generator; Appendix C exact prompts and extended experiments。