目录
一、节点功能概述
绝对值节点(Absolute Node)是 Unity Shader Graph 中用于计算数值绝对值的基础数学工具。它接收一个动态向量(Dynamic Vector)作为输入,输出该向量的绝对值 —— 即输入中所有正数分量保持不变,负数分量则转换为对应的正数。无论是标量(float)、二维向量(float2)、三维向量(float3)还是四维向量(float4),该节点都能按分量独立计算绝对值,适用于需要消除负数影响的场景(如距离计算、方向修正、数值范围约束等)。其核心优势在于:
- 分量级运算:对向量的每个分量单独计算绝对值,不影响其他分量
- 多维度兼容:支持任意维度的动态向量输入(1D 到 4D),适配多样化计算需求
- 运算高效:基于 HLSL 的
abs
函数实现,计算开销低,适合高频调用
二、端口详解
端口名称 | 方向 | 类型 | 描述 |
---|---|---|---|
In | 输入 | Dynamic Vector | 输入值(可为 float、float2、float3 或 float4) |
Out | 输出 | Dynamic Vector | 输入值的绝对值,维度与输入一致 |
三、技术原理解析
3.1 绝对值运算逻辑
节点的核心功能是对输入的每个分量执行绝对值运算,数学定义为
其中i表示向量的分量索引(如 x、y、z、w)。
3.2 生成代码解析
节点的实现基于 HLSL 的abs
函数,示例代码如下(以 float4 输入为例):
hlsl
void Unity_Absolute_float4(float4 In, out float4 Out)
{
Out = abs(In); // 对输入向量的每个分量计算绝对值
}
- 动态适配:若输入为 float(1D),函数会自动适配为
abs(In)
;若为 float3(3D),则计算float3(abs(In.x), abs(In.y), abs(In.z))
,无需手动处理维度差异。
四、应用场景与实战案例
4.1 距离计算修正
场景:确保两点间的距离为非负值
- 需求:计算两个点在某一轴上的距离(如 X 轴),结果需为正数
- 实现步骤:
hlsl
// 两个点的X坐标 float x1 = pointA.x; float x2 = pointB.x; // 计算差值(可能为负) float deltaX = x1 - x2; // 取绝对值得到距离(确保非负) float distanceX = AbsoluteNode.Out; // 输入为deltaX
4.2 方向向量处理
场景:忽略方向向量的正负,仅保留幅度信息
- 步骤:
hlsl
// 世界空间中的方向向量(可能包含负分量) float3 direction = normalize(targetPos - originPos); // 取绝对值,得到各轴的正向幅度 float3 directionMagnitude = AbsoluteNode.Out; // 输入为direction // 应用幅度信息(如控制纹理平铺率,避免负缩放) float2 tileRate = float2(directionMagnitude.x, directionMagnitude.z) * _BaseTile;
4.3 数值范围约束
场景:将负值转换为正数后参与混合运算
- 实现:
hlsl
// 噪声值(范围可能为[-1, 1]) float noise = snoise(uv * _NoiseScale); // 取绝对值,将范围转换为[0, 1] float positiveNoise = AbsoluteNode.Out; // 输入为noise // 基于正值噪声混合两种颜色 float3 finalColor = lerp(colorA, colorB, positiveNoise);
4.4 向量分量修正
场景:确保 UV 坐标或法线分量为非负
- 示例(修正 UV 坐标):
hlsl
// 可能包含负值的UV坐标(如镜像映射后的结果) float2 mirroredUV = uv * 2.0 - 1.0; // 范围[-1, 1] // 取绝对值,将UV范围转换为[0, 1](正向平铺) float2 positiveUV = AbsoluteNode.Out; // 输入为mirroredUV // 采样纹理(避免UV为负导致的采样错误) float3 color = SampleTexture2DNode.RGB; // UV=positiveUV
五、使用技巧与注意事项
5.1 多维度输入的处理
输入维度 | 运算逻辑(示例) | 输出结果 |
---|---|---|
float | abs(-3.5) | 3.5 |
float2 | abs(float2(-1.2, 3.4)) | float2(1.2, 3.4) |
float3 | abs(float3(-0.5, -2.0, 1.0)) | float3(0.5, 2.0, 1.0) |
5.2 与其他节点的配合
- 与减法节点配合:先计算差值(可能为负),再通过绝对值节点得到非负距离,是空间距离计算的常用组合。
- 与噪声节点配合:将噪声的负值部分转换为正值,扩展噪声的应用场景(如均匀的凹凸效果)。
- 与归一化节点配合:先归一化方向向量,再取绝对值,可分离方向的幅度与正负信息。
5.3 性能与兼容性
- 性能特性:绝对值运算属于基础数学操作,计算成本极低,可在顶点着色器或片段着色器中高频使用。
- 平台兼容性:所有平台均支持
abs
函数,无兼容性问题。
六、总结与拓展应用
绝对值节点作为基础的数学工具,虽功能简单但应用广泛,其核心价值在于:
- 消除负值影响:确保数值在非负范围内参与计算,避免逻辑错误(如负距离、负缩放)。
- 简化运算流程:无需手动编写条件判断(如
if (x < 0) x = -x
),直接通过节点实现分量级处理。 - 适配多维度数据:自动兼容从标量到四维向量的输入,满足多样化的数学运算需求。
拓展方向:
- 结合绝对值节点实现对称图案生成(如左右对称的纹理映射)。
- 在碰撞检测中使用绝对值计算轴对齐包围盒(AABB)的距离。
- 对法线贴图的分量取绝对值,修正光照计算中的方向偏差。