Comparison 节点是 Unity Shader Graph 中用于比较两个数值的基础逻辑节点。它根据用户在下拉选单中选择的特定条件来比较输入值 A 和 B,并输出一个布尔值(Boolean)结果。这个节点在着色器编程中扮演着逻辑判断的角色,类似于传统编程语言中的比较运算符。
在图形着色器开发中,Comparison 节点通常与 Branch 节点配合使用,用于创建条件分支逻辑。通过比较不同的数值参数,开发者可以实现基于特定条件的着色效果变化,比如根据顶点位置决定颜色、根据深度值混合纹理,或者根据时间参数动态调整效果。
Comparison 节点的强大之处在于它的通用性和灵活性。它可以处理各种类型的浮点数比较,从简单的等值判断到复杂的大小关系评估。无论是创建交互式材质、实现动态效果,还是优化着色器性能,Comparison 节点都是不可或缺的工具。
端口

Comparison 节点的端口设计简洁而高效,包含两个输入端口和一个输出端口,每个端口都有特定的功能和用途。
输入端口
- A:第一个输入值,数据类型为 Float(浮点数)。这个端口接收需要比较的第一个数值,可以是常量、属性、纹理采样结果或其他节点的输出。在实际应用中,A 端口可以连接各种类型的数值数据,包括但不限于时间参数、空间坐标、颜色通道值或自定义计算结果的标量值。
- B:第二个输入值,数据类型同样为 Float(浮点数)。这个端口接收需要比较的第二个数值,与 A 端口的值进行基于选定条件的比较。B 端口的输入源可以与 A 端口相同,也可以是不同的数值来源,这为创建复杂的比较逻辑提供了灵活性。
输出端口
- Out:输出值,数据类型为布尔值(Boolean)。这个端口输出比较结果,当比较条件成立时输出 True(在着色器中通常表示为 1),条件不成立时输出 False(通常表示为 0)。这个布尔输出可以直接驱动其他逻辑节点,特别是 Branch 节点,用于创建条件执行路径。
端口之间的数据流是单向的,从输入端口 A 和 B 接收数据,经过内部比较逻辑处理,最终从 Out 端口输出结果。这种设计确保了数据的清晰流动和节点的可预测行为。
控件
Comparison 节点的核心控制是一个下拉选单,提供了六种不同的比较条件选项。这些条件涵盖了数值比较的所有基本关系,使开发者能够精确控制比较逻辑。
- Equal:相等比较。当输入值 A 精确等于 B 时,输出 True。这种比较对于判断两个数值是否完全相同非常有用,例如检测特定阈值或匹配状态。在浮点数比较中,由于精度问题,完全相等的判断需要谨慎使用,特别是在处理计算结果的场合。
- NotEqual:不等比较。当输入值 A 不等于 B 时,输出 True。这是 Equal 条件的反向操作,用于检测数值差异。在着色器中,不等比较常用于创建"非此即彼"的效果,或者当需要排除特定数值时使用。
- Less:小于比较。当 A 严格小于 B 时,输出 True。这种比较适用于创建基于阈值的效果,如淡入淡出、距离衰减或层级混合。小于比较是许多动态效果的基础,特别是那些需要随着参数增加而逐渐变化的效果。
- LessOrEqual:小于或等于比较。当 A 小于或等于 B 时,输出 True。这个条件结合了小于和等于两种情况,提供了更全面的比较范围。在需要包含边界值的场景中特别有用,比如范围检测或区间判断。
- Greater:大于比较。当 A 严格大于 B 时,输出 True。与小于比较相反,大于比较用于检测数值的上限或创建随着参数减小而变化的效果。在创建基于高度的效果、深度测试或优先级系统时非常实用。
- GreaterOrEqual:大于或等于比较。当 A 大于或等于 B 时,输出 True。这个条件结合了大于和等于两种情况,适用于需要包含上限边界值的比较场景。
选择合适的比较条件取决于具体的应用需求。在实际开发中,开发者需要根据期望的逻辑行为和数值特性来选择最合适的比较方式。例如,在处理边界情况时,LessOrEqual 和 GreaterOrEqual 通常比严格的 Less 和 Greater 更安全,因为它们包含了边界值本身。
生成的代码示例
Comparison 节点在生成最终着色器代码时,会根据选择的比较条件产生相应的比较函数。这些函数采用标准的三元运算符实现,确保高效的条件判断。以下是对每个比较类型生成代码的详细解析:
Equal 相等比较
css
HLSL
void Unity_Comparison_Equal_float(float A, float B, out float Out)
{
Out = A == B ? 1 : 0;
}
这段代码实现了一个简单的相等比较函数。当输入值 A 和 B 精确相等时,函数返回 1(True),否则返回 0(False)。在底层实现中,Shader Graph 会将这个函数嵌入到主着色器代码中,并在需要比较的地方调用它。
相等比较在着色器中有多种应用场景,例如:
- 检测特定阈值或临界点
- 匹配预设的状态或模式
- 创建基于二进制开关的效果
NotEqual 不等比较
css
HLSL
void Unity_Comparison_NotEqual_float(float A, float B, out float Out)
{
Out = A != B ? 1 : 0;
}
不等比较函数是相等比较的逻辑互补。当 A 和 B 不相等时返回 1,相等时返回 0。这种比较在需要差异检测的场景中非常有用,比如:
- 创建当数值变化时才激活的效果
- 实现非均匀或随机分布的模式
- 检测用户输入或外部参数的变化
Less 小于比较
css
HLSL
void Unity_Comparison_Less_float(float A, float B, out float Out)
{
Out = A < B ? 1 : 0;
}
小于比较函数检查 A 是否严格小于 B。如果是,返回 1,否则返回 0。这种比较是许多渐变和过渡效果的基础:
- 创建基于距离的淡出效果
- 实现随着参数增加而逐渐显现的效果
- 在材质中创建裁剪区域或遮罩
LessOrEqual 小于或等于比较
css
HLSL
void Unity_Comparison_LessOrEqual_float(float A, float B, out float Out)
{
Out = A <= B ? 1 : 0;
}
这个函数结合了小于和等于两种情况,提供更全面的比较范围。当 A 小于或等于 B 时返回 1。这种包含边界值的比较在以下场景中特别重要:
- 范围检测和区间判断
- 创建包含完整边界的效果
- 在物理模拟中处理临界状态
Greater 大于比较
css
HLSL
void Unity_Comparison_Greater_float(float A, float B, out float Out)
{
Out = A > B ? 1 : 0;
}
大于比较函数检查 A 是否严格大于 B。这种比较与小于比较相反,适用于不同的应用场景:
- 创建基于高度的效果(如雪地足迹、水位线)
- 实现随着参数减小而逐渐显现的效果
- 在游戏机制中检测超越阈值的情况
GreaterOrEqual 大于或等于比较
css
HLSL
void Unity_Comparison_GreaterOrEqual_float(float A, float B, out float Out)
{
Out = A >= B ? 1 : 0;
}
这个函数结合了大于和等于比较,当 A 大于或等于 B 时返回 1。与 LessOrEqual 类似,这种包含边界值的比较在很多实际应用中更加实用:
- 处理包含上限的区间
- 创建完整的状态切换系统
- 在用户界面效果中处理交互边界
【Unity Shader Graph 使用与特效实现】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)