节点功能概述
Subtract节点是Unity URP ShaderGraph中执行向量减法运算的核心数学工具。该节点接收两个动态向量(Dynamic Vector)作为输入,支持标量、float2、float3、float4等多种数据类型,并返回两个输入向量的逐分量差结果。其核心特性包括:
- 逐分量运算:对向量的每个分量独立执行减法操作,结果维度与输入保持一致
- 数据类型兼容性:支持不同维度向量的混合运算(如float3与float2的自动扩展处理)
- 数学严谨性:基于标准向量减法运算规则,确保跨平台结果一致性
端口详解
Subtract节点包含三个关键端口:
- 输入端口A:作为被减数的向量输入,数据类型需与B端口匹配
- 输入端口B:作为减数的向量输入,数据类型需与A端口匹配
- 输出端口:返回A-B的差值结果,数据类型与输入端口保持一致
技术原理解析
数学定义
Subtract节点的数学表达式为:
Out = A - B
其中,A和B为同维向量,Out为结果向量
生成代码解析
Subtract节点在编译时生成的HLSL代码示例如下:
hlsl
float3 Subtract(float3 a, float3 b) {
return a - b;
}
与其他数学节点的对比
- 与Add节点对比:Add节点执行加法运算,而Subtract节点执行减法运算
- 与Multiply节点对比:Multiply节点执行分量乘法,通常用于缩放操作
- 与Divide节点对比:Divide节点执行分量除法,会产生非线性变化
应用场景与实战案例
基础颜色混合
通过Subtract节点实现颜色混合,创建特殊视觉效果:
- 场景:将两个颜色向量相减,生成负片效果
- 实现步骤:
- 创建两个Color节点,分别设置颜色A和颜色B
- 将颜色A和颜色B连接到Subtract节点的输入端口
- 将Subtract节点的输出连接到Master节点的基础颜色输入
动态UV偏移
结合Time节点和Subtract节点实现动态UV偏移:
- 场景:创建随时间变化的UV动画
- 实现步骤:
- 创建Time节点,获取当前时间值
- 创建Multiply节点,将时间值与偏移量相乘
- 使用Subtract节点从原始UV坐标中减去时间偏移量
- 将Subtract节点的输出连接到SampleTexture2D节点的UV输入
高级光照计算
在PBR材质中使用Subtract节点模拟高级光照效果:
- 场景:创建金属边缘高光效果
- 实现步骤:
- 创建Normal节点,获取法线向量
- 创建Light Direction节点,获取光源方向
- 使用DotProduct节点计算法线与光源方向的点积
- 使用Subtract节点从固定值中减去点积结果
- 将结果连接到高光强度或自发光通道
使用技巧与注意事项
处理负数的特殊逻辑
Subtract节点对负数的处理遵循数学规则,例如:
- 输入A为(3.0, -1.0, 0.0),B为(1.0, 0.5, 0.0),输出为(2.0, -1.5, 0.0)
- 注意负数运算可能导致颜色值超出[0,1]范围
与Frac节点结合
Subtract节点与Frac节点结合可实现数值量化效果:
- 场景:将浮点数值转换为整数显示
- 实现步骤:
- 创建Frac节点,获取输入值的小数部分
- 将原始输入值与Frac节点输出连接到Subtract节点
- 将整数结果应用于颜色索引或UV坐标
浮点数精度问题
Subtract节点浮点数运算可能产生精度误差,建议:
- 避免在关键视觉效果中使用过多递归减法
- 使用Fixed属性节点限制浮点数精度
- 对于高精度需求,考虑使用Half或Float精度设置
总结与拓展应用
Subtract节点是ShaderGraph中实现向量减法运算的核心工具,其应用场景涵盖基础颜色混合、动态UV偏移、高级光照计算等多个领域。通过合理使用Subtract节点,开发者可以高效创建复杂视觉效果,同时避免手动编写代码的繁琐。
拓展应用建议:
- 结合Custom Function节点实现自定义减法逻辑
- 在Sub Graph中封装常用减法运算
- 探索Subtract节点与噪声图节点的结合
- 与Branch节点配合,实现基于条件的动态减法运算
- 结合Vertex Position节点,在顶点着色器中实现几何变形效果
高级应用场景:
- 在视觉特效中创建能量消散效果
- 结合Depth Texture实现基于深度的边缘检测
- 在卡通渲染中调整色块边界
- 与Particle System结合,创建基于速度的粒子颜色变化
【Unity Shader Graph 使用与特效实现】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)