参数¶
参数将着色器图中的常数值公开为一个具名的 GLSL Uniform,您可以在 Kanzi Studio 中调整它。如果不使用参数,常数节点的值会作为字面量烘培到生成的着色器中。要更改该值,您必须编辑图并重新生成着色器。将常数提升为参数后,生成的着色器会将其声明为 uniform,并且 Kanzi Studio 会在使用该着色器图的材质的 Properties 面板中显示它,这样设计师和集成人员无需重新打开 Shader Graph Editor 即可在运行时调整该值。
备注
参数是实验性着色器图编辑器的一部分。要启用该编辑器,请参阅 启用着色器图编辑器。
将常数提升为参数¶
要提升常数节点:
在 Shader Graph Editor 中,右键单击您要公开的常数节点。
选择 Promote to Parameter。
Kanzi Studio 会从该节点创建一个参数,将其添加到 Parameters 面板,并将该节点绑定到新参数。下次生成着色器时,Kanzi Studio 会为该值生成 uniform 声明,而不是内联字面量。
您可以提升以下类型的常数节点:
常数节点 |
参数类型 |
|---|---|
Scalar |
float |
Int |
int |
Vec2 |
vec2 |
Vec3 |
vec3 |
Vec4 |
vec4 |
Color (RGB) |
color(alpha 固定为 1) |
Color (RGBA) |
颜色 |
Texture |
texture |
数学节点、内置节点和输出节点无法提升。
使用 Parameters 面板¶
Parameters 面板列出图中的所有参数。每一行显示参数名称以及一个根据类型适配的默认值编辑器。
编辑器会根据参数类型进行调整:
float 和 int:数值输入框。
vec2、vec3、vec4:一行带标签(X/Y/Z/W)的输入框。
color:颜色选择器,当源节点具有 alpha 通道时还带有 alpha 滑块。
texture:纹理选择器。
编辑默认值¶
在 Parameters 面板中编辑值字段。Kanzi Studio 会将新的默认值应用到绑定到该参数的每个节点。下次生成着色器时,新的默认值将作为 uniform 的初始值输出。
重命名参数¶
编辑参数行的名称字段。新名称会显示在 Parameters 面板中,并在下次生成着色器后显示在使用该着色器图的材质的 Properties 面板中。
选择绑定的节点¶
要查找参数驱动的节点,请点击参数行上的 Select instances。Kanzi Studio 会在画布上选中绑定到该参数的每个节点。
添加更多绑定的节点¶
将参数行拖动到画布上。Kanzi Studio 会创建一个绑定到该参数的新常数节点。所有绑定的节点共享该参数的默认值。编辑默认值时,每个绑定的节点都会随之更新。
取消提升(删除参数)¶
取消提升有两种方式,作用范围不同:
解除单个节点的绑定: 右键单击绑定的常数节点,然后选择 Unpromote from Parameter。Kanzi Studio 仅移除该节点的绑定。在下次生成的着色器中,该节点会将其当前值保留为内联字面量。该参数仍保留在 Parameters 面板中,并继续驱动仍绑定到它的其他节点。
删除参数: 点击参数行上的垃圾桶图标。Kanzi Studio 会询问您是:
仅删除参数。绑定的常数节点保留在画布上,并将其最后的值作为内联字面量。
删除参数以及绑定到它的每个节点。
移除参数的最后一个绑定后(无论是逐个解除节点绑定还是删除参数),下次生成的着色器会重新内联常数值,而不再声明 uniform。
在 Kanzi Studio 中调整参数¶
图中的每个参数都会成为使用该着色器图的材质上的一个属性。生成着色器,然后在 Kanzi Studio 中:
在 Library > Materials and Textures > Shader Graphs 中,选择包含参数的着色器图。
在 Properties 中,找到名称与该参数匹配的属性。
像编辑任何内置材质属性一样编辑该属性。
您在 Properties 面板中所做的更改会回传到 Shader Graph Editor:新值成为参数的默认值,并且绑定到该参数的每个节点都会相应更新。
借助这种双向同步,着色器图作者可以发布一组精选的可调值,设计师和集成人员无需改动着色器图本身即可调整这些值。
生成的 GLSL:Uniform 与字面量¶
提升常数会使生成的 GLSL 从内联字面量变为 uniform 声明。
提升前: 值为 (0.8, 0.2, 0.5) 的 Vec3 常数直接内联到着色器中:
void main() {
vec3 baseColor = vec3(0.8, 0.2, 0.5);
/* ... */
}
提升之后: 同一个值会成为 Kanzi Studio 在着色器顶部声明的 uniform,其余代码读取该 uniform:
uniform vec3 u_MyMaterial_param_1;
void main() {
vec3 baseColor = u_MyMaterial_param_1;
/* ... */
}
Kanzi Studio 只为 Output 节点通过着色器图可以到达的参数声明 Uniform。绑定节点未连接的参数不会出现在生成的着色器中。
对于纹理参数,Kanzi Studio 还会生成一个小型包装函数,用于对纹理采样并公开 RGBA 通道,使着色器图的其余部分能够像读取 Texture 节点一样读取该纹理。