MENU

• 2026 年 04 月 20 日 • 已有 8 只咪围观过 • -学海无涯-

现在很多材质ai已经可以写了,但是拿到hlsl以后还需要去创建材质,添加custom,手动添加材质,然后加各种参数,填写默认值,还是很麻烦

这些步骤本身并不难,却很消耗耐心。尤其当你需要反复验证效果、频繁替换代码,加一个input,删两个input的时候,这种身心上的成本会比想象中更重。
所以我花了两个晚上的时间,写了这个小脚本。


为什么做这个功能

我一直觉得,AI 帮我们写出一段代码,和这段代码真正进入生产流程,中间其实隔着很长一段距离。

尤其是材质系统相关的内容,它并不是“代码能跑”就结束了。
它还要能被整理、能被复用、能被其他人理解,也要能以更稳定的形式进入项目。
如果每一次都要从头手工搭建一遍材质节点和参数,那前面节省下来的时间,很容易又在后面被一点点消耗掉。

所以这个脚本想解决的,并不是“如何生成 HLSL”,而是另一个更实际的问题:

如何让 HLSL 更顺畅地进入 Unreal 的材质工作流。

把这一步补上之后,AI、现成的 shader 逻辑、或者自己手写的 HLSL,才算真正开始变得好用。


关于这次演示用到的 HLSL

这次演示里的 HLSL,可以在 Shadertoy 找到对应的 GLSL。
而 GLSL 转 HLSL 这件事,其实在 GitHub上已经有比较成熟的方案了。就我自己的体验来说,在“语法映射”和“结构转换”这个层面上,这类现成方案往往比 AI 更稳定,也更可控。
上不了Git,B站上搜“ue shadertoy”也有相当多的教程。

AI 的优势更适合用在辅助理解这些环节 ,但如果是偏工程化、偏规则映射的工作,成熟方案通常还是更可靠一些。
它真的有概率会瞎改里面逻辑。

我并不是在否定 AI。恰恰相反,我觉得 AI 已经非常有用了。
只是它更适合作为工具链中的一环,而不是替代一切的答案。

真的,不要太迷信Vibe Coding...


一些AI写材质的想法

这里和具体用哪个模型关系不大。
我更想表达的是AI 是否真的能帮到你,很大程度上取决于你自己现在站在哪个阶段。

我经历过几个阶段,我觉得使用ai会出现两种情况。

第一种:你已经有一定的 HLSL 基础

如果你对 HLSL 已经有一定理解,并且脑子里很清楚自己想实现什么效果、需要哪些逻辑、哪里应该怎么拆,那么 AI 大概率会成为一个很好的加速器。AI去实现逻辑是非常好的。

它可以帮你省去很多重复劳动,比如补函数、整理结构、快速试不同写法,或者把一个已经成型的思路更快地展开。

我自己是从 2023 年开始接触 HLSL 的。
在 CSDN 上还能看到我当时纯手写的一些 Groom 材质内容。现在回头看,那时的实现当然还很简单,但它对我来说很重要,因为很多理解都是从那个阶段一点点建立起来的。
后面我也写过一些后处理相关的内容,其中一部分已经开源,另外一些还没有整理出来。

第二种:你只是想靠 AI 直接抽出结果

另一种情况就在一些情况下很常见了。
你并没有真正理解代码,但你希望通过不断描述效果,让 AI 直接给你抽出一个满意的结果。

这当然不是不可以,只是它很像抽卡。

因为 AI 对“逻辑”的理解,通常远远强于它对“美术效果描述”的理解。
你说“我想要一种更柔一点、轻一点、空气感更强的边缘变化”,对人类美术来说这可能是很自然的表达;
但对 AI 来说,这样的描述往往并不稳定,它更容易抓住结构性的指令,而不是审美里的微妙差异。

所以最后经常会变成: ..你可能要抽很多次,才接近你想要的东西。也可能抽很久,仍然得不到真正符合预期的结果。

如果在这个过程中你又完全看不懂代码,那会很被动。因为你既无法判断它到底写得对不对,也无法自己做最后那一步修正。

所以我觉得如果想认真把 AI 用进 shader 工作流里,至少先学一点基础语法。

不用一开始就学得很深。
先能看懂输入输出,能理解函数结构,知道一个效果大概是怎么被组织出来的,这就已经很有帮助了。

我是纯美术出身,大学连数学课都没认真上过几节。
但我后来还是一点点把这些东西学下来了。
所以如果你现在也正站在这个门口,不用太怀疑自己。
我可以学会,你也可以。

(说实话,有那个时间等抽卡,教程已经看完了..)


如果你想直接看 C++ 的实现

如果你更关心这个工具本身是怎么落地的,尤其是如何直接通过 C++ 去生成对应结构,可以看我的上一篇博客。也可以看我AngelScript那一篇。只是AS不能直接在默认创建的C++项目里面用,比较麻烦。

这里的h和cpp我发到我的git了,之前有权限的朋友可以直接获取。

如果你打开是404,说明你没有权限

目前支持的参数写法

现在这个 HLSL 解析方式,支持三种输入习惯。

第一种比较简单:
只写参数名,不写默认值。
这种情况下,生成出来的默认值会是 0

第二种是把默认值也直接写进注释里。
这样在生成材质参数时,就可以自动带上预设值,省掉后续手动填写的步骤。

格式如下:

// @input {数据类型} {参数名字} = {默认值}

第三种是自己会分析有没有应该input的但是你前面漏写了。


视频演示

返回文章列表 打赏
本页链接的二维码
打赏二维码