使用 GLSL Code 节点进行自定义着色¶
本教程将引导您使用 GLSL Code 节点在着色器图中嵌入手写的 GLSL。您将编写一个小函数,其签名定义节点的输入和输出端口,然后将这些端口连接到图中,并生成调用该函数的片段着色器。
GLSL Code 节点会解析您的函数签名并据此生成端口:每个 in 参数成为一个输入端口,每个 out 参数成为一个输出端口,inout 参数同时成为输入和输出端口,非 void 返回类型会添加一个名为 return 的输出端口。支持的端口类型有 float、vec2、vec3、vec4、int、bool 和 sampler2D。
前提条件¶
开始之前:
启用 Shader Graph Editor。请参阅 启用着色器图编辑器。
创建着色器图¶
在 Library 中,按 Alt 并右键单击 Materials and Textures > Shader Graphs,然后选择 Shader Graph。Kanzi Studio 会创建着色器图并打开 Shader Graph Editor。
在编辑器左上角的 Material 下拉菜单中,选择 Fullscreen。Material Output 节点随即更新,仅提供一个 Color 输入。
添加 GLSL Code 节点¶
在画布上右键单击,然后选择 Custom > GLSL Code。随即出现 GLSL Code 节点,其中包含 Function name 字段和一个嵌入式 GLSL 编辑器。
在 Function name 字段中输入
Checker。在嵌入式 GLSL 编辑器中输入以下函数:
// Soft checker mask. `tile` controls cell size; `softness` blurs cell edges. // `bright` is 1.0 on bright cells, 0.0 on dark cells. // The return value is the antialiased mask. float Checker(vec2 uv, float tile, float softness, out float bright) { vec2 cell = floor(uv * tile); bright = mod(cell.x + cell.y, 2.0); vec2 f = fract(uv * tile); float edge = min(min(f.x, 1.0 - f.x), min(f.y, 1.0 - f.y)); return smoothstep(0.0, softness, edge) * bright; }
在您输入函数签名时,编辑器会根据参数生成端口:
uv(vec2)、tile(float) 和softness(float) 成为输入端口;bright(float) 成为输出端口;非void的返回类型会添加一个return输出端口。
将节点连接到图中¶
在本节中,您将使用 UV 节点驱动 GLSL Code 节点,并将其输出连接到 Material Output 节点。
在画布上点击右键并选择 UV。从 UV 节点的 uv 输出端口拖动到 GLSL Code 节点的 uv 输入端口。
在画布上点击右键并选择 Scalar。将值设置为
8.0,并将其 result 输出连接到 GLSL Code 节点的 tile 输入端口。再添加一个 Scalar 节点,将值设置为
0.05,并将其 result 输出连接到 GLSL Code 节点的 softness 输入端口。在画布上点击右键并选择 Combine4。Material Output 的 Color 输入接受 vec4,因此您需要将 GLSL Code 节点的 float 类型
return提升为 vec4。从 GLSL Code 节点的 return 输出端口分别拖动到 Combine4 节点的 r、g 和 b 输入端口。现在棋盘格遮罩驱动全部三个颜色通道,生成灰度结果。
再添加一个 Scalar 节点,将值设置为
1.0,并将其 result 输出连接到 Combine4 节点的 a 输入端口。从 Combine4 节点的 result 输出端口拖动到 Material Output 节点的 Color 输入端口。
生成着色器¶
点击 Generate Shader。着色器编译成功后,会显示绿色的 Shader compiled successfully 通知,并且 Kanzi Studio 会为全屏通道创建一个 Material Type。
如果 GLSL Code 主体无法解析或编译,Problems 面板会显示错误。常见错误包括:函数签名中使用了不受支持的端口类型、多函数主体中缺少 main 函数或唯一函数,以及调用处的返回类型不匹配。