目录
一、前言
在视觉效果设计中,径向扭曲(如水面涟漪、镜头畸变、金属表面的放射状变形)是增强画面动感的重要手段。Unity Shader Graph 中的径向剪切节点(Radial Shear Node)专为这一需求设计,它能对输入的 UV 坐标应用类似波浪的径向剪切扭曲效果,通过定义中心参考点、扭曲强度和通道偏移,生成具有放射状拉伸或扭曲的 UV,为纹理采样提供独特的变形基础。
无论是模拟水波纹扩散、镜头的鱼眼效果,还是金属表面的径向划痕,该节点都能高效实现这类扭曲效果。本文将详细解析其功能、原理及应用,助力开发者创造丰富的视觉扭曲效果。
二、节点功能概述
径向剪切节点(Radial Shear Node)的核心功能是对输入 UV 坐标应用径向剪切扭曲,其效果类似从中心向外扩散的波浪或放射状拉伸 —— 距离中心越远的 UV,扭曲程度可能越明显(受强度参数控制)。
其核心特性在于:
- 以指定中心点(Center)为基准,向四周产生径向剪切扭曲;
- 扭曲强度(Strength)可调节,值越大,剪切效果越剧烈;
- 支持通过 Offset 参数偏移扭曲后的 UV 通道,制造不对称或复杂扭曲;
- 输出的扭曲 UV 可直接用于纹理采样,实现具有径向动态的视觉效果。
三、端口详解
端口名称 | 方向 | 类型 | 描述 |
---|---|---|---|
UV | 输入 | Vector 2 | 输入的 UV 坐标(原始纹理采样坐标,范围通常为 [0,1]) |
Center | 输入 | Vector 2 | 扭曲效果的中心参考点(UV 空间中的坐标,如 (0.5,0.5) 为中心) |
Strength | 输入 | Float | 扭曲效果的强度(值越大,剪切扭曲越明显;负值可产生反向扭曲) |
Offset | 输入 | Vector 2 | 输出 UV 的通道偏移(x 分量偏移 U 通道,y 分量偏移 V 通道,用于微调扭曲的对称性) |
Out | 输出 | Vector 2 | 经过径向剪切扭曲后的 UV 坐标,可直接用于纹理采样 |
四、工作原理简析
径向剪切节点的扭曲逻辑基于 “UV 到中心的距离” 和 “垂直于径向的剪切方向”,核心步骤如下:
-
计算中心偏移:
首先计算输入 UV 与中心参考点(Center)的偏移向量delta
:hlsl
float2 delta = UV - Center; // delta为UV相对于中心点的位置偏移
-
计算径向距离因子:
通过delta
的点积(即向量长度的平方)计算 “距离中心的平方”,作为扭曲强度的基础因子:hlsl
float delta2 = dot(delta.xy, delta.xy); // delta2 = x² + y²(距离中心的平方,值越大表示离中心越远)
-
计算扭曲偏移量:
结合强度参数(Strength),计算径向剪切的偏移量delta_offset
—— 距离中心越远(delta2 越大),扭曲偏移越明显:hlsl
float2 delta_offset = delta2 * Strength; // 扭曲强度与距离平方成正比
-
应用剪切扭曲:
对 UV 进行剪切扭曲:通过float2(delta.y, -delta.x)
获取垂直于径向的方向(顺时针旋转 90 度的方向),与delta_offset
相乘得到最终扭曲量,再叠加 Offset 偏移:hlsl
Out = UV + float2(delta.y, -delta.x) * delta_offset + Offset;
五、应用场景
径向剪切扭曲的核心是 “以中心为原点,沿放射状方向产生垂直于径向的剪切”,适合以下场景:
5.1 水波纹效果
场景:模拟水面被物体撞击后产生的径向涟漪扭曲
- 实现步骤:
- 将 Center 设为波纹中心(如鼠标点击位置,通过脚本传递
_Center
参数); - Strength 设为较小的正值(如 0.02),使扭曲随距离中心的平方递增(模拟涟漪向外扩散时的衰减);
- 配合 Time 节点动态调整 Strength:
Strength = sin(Time * 5) * 0.01
,使涟漪随时间波动; - 扭曲后的 UV 用于采样水纹理,实现动态波纹效果:
hlsl
float2 distortedUV = RadialShearNode.Out; // 输入:UV=IN.uv, Center=_Center, Strength=sin(Time*5)*0.01, Offset=0 float3 waterColor = SAMPLE_TEXTURE2D(_WaterTex, sampler_WaterTex, distortedUV).rgb;
- 将 Center 设为波纹中心(如鼠标点击位置,通过脚本传递
5.2 镜头畸变效果
场景:模拟鱼眼镜头或广角镜头的径向扭曲,增强画面张力
- 参数设置:
- Center 设为 UV 中心 (0.5,0.5),使扭曲以画面中心对称;
- Strength 设为较大的负值(如 - 0.05),产生向中心收缩的扭曲(鱼眼效果);
- Offset 设为 (0,0),保持对称扭曲;
- 扭曲后的 UV 用于采样场景纹理,模拟镜头畸变:
hlsl
float2 distortedUV = RadialShearNode.Out; // 输入:UV=IN.uv, Center=0.5, Strength=-0.05, Offset=0 float3 sceneColor = SAMPLE_TEXTURE2D(_SceneTex, sampler_SceneTex, distortedUV).rgb;
5.3 金属表面径向划痕
场景:模拟金属表面被打磨后的放射状划痕扭曲
- 关键参数:
- Center 设为纹理中心 (0.5,0.5);
- Strength 设为 0.01,产生轻微扭曲;
- 配合噪声纹理增强随机性:将扭曲后的 UV 与噪声纹理采样结合,使划痕更自然:
hlsl
float2 shearUV = RadialShearNode.Out; // 基础径向剪切UV float noise = SAMPLE_TEXTURE2D(_NoiseTex, sampler_Noise, shearUV * 5).r; // 叠加噪声 float2 finalUV = shearUV + noise * 0.005; // 噪声微调扭曲 float3 metalColor = SAMPLE_TEXTURE2D(_MetalTex, sampler_MetalTex, finalUV).rgb;
六、使用注意事项
-
扭曲强度控制:
- Strength 值过大会导致 UV 扭曲过度(超出 [0,1] 范围),可能出现纹理拉伸或重复,建议范围为 ±0.1(具体根据效果需求调整);
- 负的 Strength 会产生反向扭曲(逆时针剪切),可用于模拟 “收缩” 类效果。
-
中心位置的影响:
- Center 的位置直接决定扭曲的原点,动态修改 Center(如通过 Time 动画)可实现 “移动的扭曲中心”(如涟漪扩散);
- 若需对称扭曲,建议 Center 设为 UV 中心 (0.5,0.5);若需不对称效果(如偏向画面左侧的扭曲),可调整 Center 为 (0.3,0.5)。
-
Offset 的妙用:
- Offset 参数可打破扭曲的严格对称性,例如 Offset=(0.01, 0) 可使 U 通道扭曲略强于 V 通道,模拟自然现象中的不对称性;
- 配合 Time 动画 Offset(如
Offset=float2(sin(Time), cos(Time)) * 0.005
),可产生动态偏移的扭曲。
-
性能考量:
节点计算仅涉及向量运算和点积,性能开销极低,可安全用于每像素计算(如全屏后处理、粒子效果)。
七、生成代码解析
节点生成的核心代码如下,关键逻辑已在注释中说明:
hlsl
void Unity_RadialShear_float(float2 UV, float2 Center, float Strength, float2 Offset, out float2 Out)
{
float2 delta = UV - Center; // 计算UV到中心的偏移
float delta2 = dot(delta.xy, delta.xy); // 计算距离中心的平方(x² + y²)
float2 delta_offset = delta2 * Strength; // 扭曲强度与距离平方成正比
// 沿垂直于径向的方向(delta.y, -delta.x)应用扭曲,叠加Offset
Out = UV + float2(delta.y, -delta.x) * delta_offset + Offset;
}
八、总结
径向剪切节点(Radial Shear Node)是 Shader Graph 中实现径向扭曲效果的高效工具,其核心价值在于:
- 扭曲特性独特:以中心为原点,沿放射状产生垂直于径向的剪切扭曲,适合模拟涟漪、镜头畸变等自然或人工效果;
- 参数可控性强:通过 Center、Strength、Offset 精准控制扭曲的中心、强度和对称性,适配多样化设计需求;
- 性能高效:轻量级计算,可广泛应用于实时渲染场景(如游戏特效、后处理)。
掌握该节点的应用,能为视觉效果增添独特的动态扭曲感,尤其在模拟自然现象(水、烟)或镜头特效时,可显著提升画面的生动性与沉浸感。实际开发中,建议结合动画参数(如 Time、外部交互位置)动态调整参数,实现更丰富的动态效果。