IDE 操作流程
本页按实际操作顺序走一遍:创建 → 编辑 → 暴露参数 → 编译 → 用到模型上。
一、创建蓝图资源
Section titled “一、创建蓝图资源”在资源面板(Project)里点 + 或在目录上点右键,选择:
- 着色器蓝图 —— 创建
ShaderBlueprint.bps,一个完整的 Shader - 着色器蓝图函数 —— 创建
ShaderFunction.bpsf,可被蓝图调用的子图
双击 .bps 即可进入蓝图编辑器。
二、编辑器分区
Section titled “二、编辑器分区”| 分区 | 作用 |
|---|---|
| 图编辑区 | 主画布:摆节点、连线、框选、拖拽平移与缩放 |
| Params 面板 | 声明对外暴露的变量(材质面板上可调的属性),以及宏 Define |
| Inspector 面板 | 蓝图整体设置:材质类型、混合方式、双面、实例化、阴影投射等(详见材质类型与终端) |
| 预览面板 | 实时预览球/模型,连线一改立刻刷新 |
| Pass 区 | 顶点终端与片元终端所在的区域,是整张图的最终出口 |
编辑器通用操作(保存、撤销、重做、复制、粘贴、删除、全选、复位视图、编译)沿用 IDE 的全局 快捷键设置,可在 IDE 的偏好设置里查看和修改。
三、添加节点
Section titled “三、添加节点”在画布空白处点右键弹出节点菜单,菜单层级与节点的菜单路径一致,例如:
math → basic → addcolor → blendinputdata → vertex → uv节点手册里每个节点都标了菜单路径,按路径找即可。
快捷键快速生成
Section titled “快捷键快速生成”长按字母/数字键,再用鼠标左键点击画布位置,即可在该处直接生成节点,不用翻菜单:
| 按键 | 生成节点 | 按键 | 生成节点 |
|---|---|---|---|
1 | Float | a | add(加) |
2 | Vector2 | M | minus(减) |
3 | Vector3 | m | multiply(乘) |
4 | Vector4 | d | divide(除) |
b | Boolean | o | oneMinus(1 − x) |
I | Int | l | mix(插值) |
i | if(三路比较分支) | e | pow(幂) |
t | sampler2D(2D 纹理采样) | n | normalize(归一化) |
u | uv1(第二套 UV) | p | panner(UV 流动) |
- 从**输出端口(节点右侧)按住拖到输入端口(节点左侧)**即可连接。
- 一个输入端口只能接一条线;再接一条,旧的会自动断开。一个输出端口可以分发给多个输入。
- 端口颜色代表类型,类型兼容时才能连上,规则见概念篇的自动类型转换表。
- 输入端口没接线时,用它自己的内联默认值(在节点上直接编辑数字、颜色、勾选框)。
五、Params:暴露可调参数
Section titled “五、Params:暴露可调参数”Params 面板里声明的变量会变成 Shader 的 uniform,在材质 Inspector 上显示为可调属性, 也可以在代码里读写。点 Params 面板的 + 选择类型:
| 类型 | 在材质面板上的表现 |
|---|---|
| Float | 数值输入框 |
| Vector2 / Vector3 / Vector4 | 2~4 个分量输入框 |
| Color | 取色器 |
| Boolean | 勾选框 |
| Mat3 / Mat4 | 矩阵(一般由代码赋值) |
| Texture2D | 2D 贴图槽 |
| TextureCube | 立方体贴图槽 |
| Texture2DArray | 2D 纹理数组槽 |
| Texture3D | 3D 纹理槽 |
| Define | 宏开关:勾选与否走不同的编译分支,比 if 分支效率高 |
声明后把该变量从 Params 面板拖进画布,就得到一个输出该值的节点。
六、保存与编译
Section titled “六、保存与编译”保存蓝图后,IDE 编译出 Shader 产物。若图里有错误(类型不匹配、必填槽悬空等),控制台会输出
[ShaderCompile]Error,预览球通常表现为纯白或不显示。
七、用到模型上
Section titled “七、用到模型上”在 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")); // 关闭八、蓝图函数(.bpsf)
Section titled “八、蓝图函数(.bpsf)”当一串运算要在多个蓝图里重复使用时,把它封装成蓝图函数:
- 资源面板创建 着色器蓝图函数,双击打开。
- 在画布右键 →
ShaderFunction→ Input In,添加输入参数,在 Inspector 里设置参数名与类型。 - 搭好运算逻辑,把结果接到 Default Output Result 节点上——函数的返回类型由接进来的数据类型自动决定。
- 保存。在任意
.bps里右键 →CustomFun分组下就能找到这个函数(按文件名列出),当作普通节点使用。
蓝图函数内部也可以调用其他蓝图函数。
九、常见问题
Section titled “九、常见问题”| 现象 | 多半是什么原因 |
|---|---|
| 预览球纯白、没有任何效果 | 连线没接到片元终端的颜色槽上;或图里有编译错误,先看控制台 |
| 改了节点参数但画面没变 | 编辑器内存中的图与磁盘不同步,关掉标签页重新打开再看 |
| 效果在 IDE 正常、发布后 Shader 404 | 该蓝图从未被打开/预览过,没有编译产物;打开一次再重新发布 |
| 两个数值相乘维度报错 | 多态节点不做维度广播,用 append / mask / swizzle 显式对齐维度 |
| 程序化图形节点接到顶点段报错 | 这些节点用 fwidth 抗锯齿,只能用于片元段 |