【UE】如何正确旋转法线贴图

这是一篇关于在虚幻引擎材质中 旋转法线贴图及正确矫正法线向量的 简短教程

问题

当我们使用 CustomRotator 等方式,对法线贴图的 UV 进行旋转时,贴图的纹理虽然旋转了,但 法线向量所代表的三维方向并没有跟着旋转

这会导致模型在受到光照时,高光和阴影的方向完全错乱。

修正

为了修复这个问题,我们必须在材质中对采样出来的法线向量进行一次反向旋转补偿

方法一:RotateAboutAxis

这是利用引擎内置节点处理三维向量旋转的最标准方法,也是最容易理解的连线方式。

核心逻辑:

将采样出的法线向量,绕着 Z 轴(0,0,1)反向旋转与 UV 相同的角度。

节点连线步骤:

  1. 获取原始法线: 正常使用 Texture Sample 采样你的法线贴图(UV 已经过 CustomRotator 旋转)。

  2. 设置旋转轴: 创建一个垂直于贴图表面方向常量 (0,0,1),连接到 RotateAboutAxis 节点的 NormalizedRotationAxis (旋转轴)引脚。

  3. 反向角度: 将你用于旋转 UV 的角度(0~1的值),乘以 -1 ,连接到 RotationAngle 引脚。

  4. 设置轴心: 将常量 0 连接到 PivotPoint(枢轴点)引脚。

  5. 输入向量: 将法线贴图的 RGB 输出,连接到 Position 引脚。

  6. ⚠️ 相加补偿(易错点): RotateAboutAxis 节点原本是为顶点偏移设计的,它输出的不是最终位置,而是偏移量 。因此,你必须用一个 Add 节点,将原始法线的 RGBRotateAboutAxis 的输出结果相加,才是最终正确的法线


方法二:使用 Sine / Cosine 数学节点(极致性能、纯二维旋转)

通过观察RotateAboutAxis(0,0,1)轴旋转,

不难发现,法线贴图的 Z 轴(蓝色通道(0,0,1))在平面旋转时其实是不变的,我们只需要旋转 X 和 Y(红、绿通道)。

利用纯数学节点进行二维旋转矩阵计算,可以省去 RotateAboutAxis 内部复杂的三维运算,性能开销极低 *。

核心逻辑:

利用二维向量旋转公式:

  • NewX = X * Cos(角度) - Y * Sin(角度)
  • NewY = X * Sin(角度) + Y * Cos(角度)

在虚幻引擎的材质编辑器 中,SineCosine 节点的默认周期是 1.0 。这极其方便,意味着可以直接把 CustomRotator0~1 的角度值连给它们(依然要乘以 -1来反转旋转)。

有关性能

  • 在现代 GPU 中,方法一和方法二相差微乎其微。
    方法一大约8个指令,方法二大约16个指令。RotateAboutAxis被被设计成可以绕着任意三维轴,虽然会因为旋转公式多出一倍指令,但编辑器理论上会根据绝对常量 (0, 0, 1)优化掉跟X和Y相关的叉积、点积乘法(结果肯定都是0),会精简的和方法二几乎一样,放心大胆地用 RotateAboutAxis
  • 除非你在做极其严苛的优化
    那么方法二还可以进一步优化,充分利用 GPU 的 SIMD特性
    把它们组合成 V2 向量,它可以拆解为两部分相加
    NewV2 = (X*Cos, Y*Cos) + (-Y*Sin, X*Sin)
    提取公因式,就变成了非常优雅的向量运算:
    NewV2 = (X, Y) * Cos + (Y, X) * (-Sin, Sin)

    把原本需要 4次乘法、2次加减法,压缩成了 3个乘法 和 1个加法。
相关推荐
桌面运维家2 小时前
Windows性能优化:任务管理器深度使用指南
windows·性能优化
mxwin2 小时前
Unity Shader 几何着色器:动态生成图元与顶点拓扑修改
unity·游戏引擎·着色器
weixin199701080163 小时前
《QX 游戏商城商品详情页前端性能优化实战》
前端·游戏·性能优化
清水白石0083 小时前
Python 性能优化避坑指南:回归风险防控、基准压测与安全回滚实战
python·性能优化·回归
猿小喵3 小时前
MySQL数据库参数解读-第一篇
数据库·mysql·性能优化
七七powerful4 小时前
MySQL 8.0 性能优化利器:Percona Toolkit 实战指南
数据库·mysql·性能优化
weixin1997010801617 小时前
《识货商品详情页前端性能优化实战》
前端·性能优化
伪善者19 小时前
UE5 插件打包成DLL
ue5·打包
zuozewei1 天前
国产化之TDSQL性能优化方案
性能优化