好久木有写东西惹,人家最近实在是太懒惰,是大懒虫,不想写字么ww
目标是成为CV大师
想必你也知道 BluePrint 这种东西最不招人家 AI 大小姐喜欢了,目前实在找不到一个合适的工作流来为 Agent 简洁的呈现节点之间的逻辑关系。
与此同时 AI 自己对蓝图的控制能力十分孱弱,通过操纵 UE 原生暴露的路径,连出的蓝图惨不忍睹,随处可见的断线与孤立节点,各种自由发挥的摆放位置与随意重叠的节点,时刻在暗示我 Epic 这是为了保住行业的饭碗。
相较于让 AI 花费大量时间在对接 UE 的低智设计,于是在2026年,材质编写的工作流又由从蓝图重新退化回了手搓着色器代码,令人忍俊不禁。
当我反复往返于浏览器和 UE 编辑器的窗口,向着 Custom 节点里面粘贴大堆 AI 生成的低质量带注释中英双语 HLSL,扮演 CV 工程师的时候,最讨厌的事情就是在 Detail 面板一个个手动添加插入 pin,再一字不差的粘变量名。

Custom 这节点本来就难用至极,那半残的输入框摆明了就是让你从外面的 IDE 里写完粘过来,每一个 pin 无论使用与否都必须连一根线才能过编译。pin之间的排序完美的践行了栈的设计,换个位置要把后续输入全删一遍,实在算不上优雅。
Pin的自动化插入
这里实现一个全自动插入节点的 Editor-only 插件,来帮助我实现成为CV大师的理想。
Custom 节点本质上是 UMaterialExpressionCustom,输入 pin 存在它的 Inputs 数组里;插件要做的是解析 Code 里的自由变量名,然后补齐 Inputs。也就是说,插件只要改 UMaterialExpressionCustom::Inputs,再刷新材质图,就能自动生成 pin。
不过真正麻烦的地方不是添加 pin,而是从 HLSL 代码里准确判断哪些名字应该变成输入 pin,比如这段:
1 | float3 dir = normalize(WindDirWS); |
插件应该自动添加:WindDirWS,HeightMask,Strength
但不应该添加:normalize,saturate,dir,h,return
所以需要一个轻量的 parser,扫描当前 HLSL 字段里的所有自由变量,让插件读取 Custom->Code,做这些事:
- 去掉注释和字符串。
- 找所有 identifier:[A-Za-z_][A-Za-z0-9_]*
- 排除 HLSL 关键字、类型名、内建函数。
- 排除局部声明变量。
- 排除函数名。
- 排除结构体成员,比如 foo.x 里的 x。
- 排除已有输入。
- 剩下的名字添加为 Custom input。
与此同时,这里要特别处理 TextureObject:
1 | float4 c = Texture2DSample(Tex, TexSampler, UV); |
真正需要添加的 pin 是 UV,而不是 TexSampler。UE 的 Custom 节点里,TextureObject 输入 Tex 对应的 sampler 通常用 TexSampler 这个约定名引用。
最后呢…
既然人家都写到这里啦,想必也猜到人家一定是写好插件惹…
仓库地址给泥,拿去随便用哦,人家都不收泥钱钱,看窝多好ww (*¯︶¯*)
CustomPinParser : Automatically sync input pins for UE Material Custom nodes by parsing HLSL.
把它的 zip 解压到泥的项目 plugin 路径下面,再启动引擎的时候就会提示去编译插件,之后在 custom 的面板里面就会出现 Parse Pins 按钮,终于可以舒服的 CV Everything 啦!
