跳转到内容

IDE 操作流程

本页按实际操作顺序走一遍:创建 → 编辑 → 暴露参数 → 编译 → 用到模型上

在资源面板(Project)里点 或在目录上点右键,选择:

  • 着色器蓝图 —— 创建 ShaderBlueprint.bps,一个完整的 Shader
  • 着色器蓝图函数 —— 创建 ShaderFunction.bpsf,可被蓝图调用的子图

双击 .bps 即可进入蓝图编辑器。

分区作用
图编辑区主画布:摆节点、连线、框选、拖拽平移与缩放
Params 面板声明对外暴露的变量(材质面板上可调的属性),以及宏 Define
Inspector 面板蓝图整体设置:材质类型、混合方式、双面、实例化、阴影投射等(详见材质类型与终端
预览面板实时预览球/模型,连线一改立刻刷新
Pass 区顶点终端与片元终端所在的区域,是整张图的最终出口

编辑器通用操作(保存、撤销、重做、复制、粘贴、删除、全选、复位视图、编译)沿用 IDE 的全局 快捷键设置,可在 IDE 的偏好设置里查看和修改。

在画布空白处点右键弹出节点菜单,菜单层级与节点的菜单路径一致,例如:

math → basic → add
color → blend
inputdata → vertex → uv

节点手册里每个节点都标了菜单路径,按路径找即可。

长按字母/数字键,再用鼠标左键点击画布位置,即可在该处直接生成节点,不用翻菜单:

按键生成节点按键生成节点
1Floataadd(加)
2Vector2Mminus(减)
3Vector3mmultiply(乘)
4Vector4ddivide(除)
bBooleanooneMinus(1 − x)
IIntlmix(插值)
iif(三路比较分支)epow(幂)
tsampler2D(2D 纹理采样)nnormalize(归一化)
uuv1(第二套 UV)ppanner(UV 流动)
  • 从**输出端口(节点右侧)按住拖到输入端口(节点左侧)**即可连接。
  • 一个输入端口只能接一条线;再接一条,旧的会自动断开。一个输出端口可以分发给多个输入。
  • 端口颜色代表类型,类型兼容时才能连上,规则见概念篇的自动类型转换表
  • 输入端口没接线时,用它自己的内联默认值(在节点上直接编辑数字、颜色、勾选框)。

Params 面板里声明的变量会变成 Shader 的 uniform,在材质 Inspector 上显示为可调属性, 也可以在代码里读写。点 Params 面板的 选择类型:

类型在材质面板上的表现
Float数值输入框
Vector2 / Vector3 / Vector42~4 个分量输入框
Color取色器
Boolean勾选框
Mat3 / Mat4矩阵(一般由代码赋值)
Texture2D2D 贴图槽
TextureCube立方体贴图槽
Texture2DArray2D 纹理数组槽
Texture3D3D 纹理槽
Define宏开关:勾选与否走不同的编译分支,比 if 分支效率高

声明后把该变量从 Params 面板拖进画布,就得到一个输出该值的节点。

保存蓝图后,IDE 编译出 Shader 产物。若图里有错误(类型不匹配、必填槽悬空等),控制台会输出 [ShaderCompile]Error,预览球通常表现为纯白或不显示。

在 IDE 里:新建材质,在材质 Inspector 的 Shader 下拉里选中蓝图对应的 Shader,Params 声明的 变量会出现在材质面板上;把材质赋给模型的渲染组件即可。

在代码里

// 方式一:直接加载 IDE 里配置好的材质
Laya.loader.load("res/matDissolve.lmat").then((mat: Laya.Material) => {
sprite.getComponent(Laya.MeshRenderer).material = mat;
// Params 里声明的变量,用同名 key 读写
mat.setFloat("u_Progress", 0.35);
mat.setColor("u_EdgeColor", new Laya.Color(1, 0.5, 0, 1));
mat.setTexture("u_NoiseMap", noiseTexture);
});
// 方式二:新建材质并指定蓝图生成的 Shader 名
let mat = new Laya.Material();
mat.setShaderName("MyBlueprintShader");

宏开关(Define 类型的 Params)用宏接口控制:

mat.addDefine(Laya.Shader3D.getDefineByName("SNOW")); // 打开
mat.removeDefine(Laya.Shader3D.getDefineByName("SNOW")); // 关闭

当一串运算要在多个蓝图里重复使用时,把它封装成蓝图函数:

  1. 资源面板创建 着色器蓝图函数,双击打开。
  2. 在画布右键 → ShaderFunctionInput In,添加输入参数,在 Inspector 里设置参数名与类型。
  3. 搭好运算逻辑,把结果接到 Default Output Result 节点上——函数的返回类型由接进来的数据类型自动决定
  4. 保存。在任意 .bps 里右键 → CustomFun 分组下就能找到这个函数(按文件名列出),当作普通节点使用。

蓝图函数内部也可以调用其他蓝图函数。

现象多半是什么原因
预览球纯白、没有任何效果连线没接到片元终端的颜色槽上;或图里有编译错误,先看控制台
改了节点参数但画面没变编辑器内存中的图与磁盘不同步,关掉标签页重新打开再看
效果在 IDE 正常、发布后 Shader 404该蓝图从未被打开/预览过,没有编译产物;打开一次再重新发布
两个数值相乘维度报错多态节点不做维度广播,用 append / mask / swizzle 显式对齐维度
程序化图形节点接到顶点段报错这些节点用 fwidth 抗锯齿,只能用于片元段

本文更新于