这是一篇关于在虚幻引擎材质中 旋转法线贴图及正确矫正法线向量的 简短教程
问题
当我们使用 CustomRotator 等方式,对法线贴图的 UV 进行旋转时,贴图的纹理虽然旋转了,但 法线向量所代表的三维方向并没有跟着旋转 。

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

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

这是利用引擎内置节点处理三维向量旋转的最标准方法,也是最容易理解的连线方式。
核心逻辑:
将采样出的法线向量,绕着 Z 轴(0,0,1)反向旋转与 UV 相同的角度。
节点连线步骤:
-
获取原始法线: 正常使用
Texture Sample采样你的法线贴图(UV 已经过CustomRotator旋转)。 -
设置旋转轴: 创建一个垂直于贴图表面方向常量
(0,0,1),连接到RotateAboutAxis节点的 NormalizedRotationAxis (旋转轴)引脚。

-
反向角度: 将你用于旋转 UV 的角度(0~1的值),乘以 -1 ,连接到 RotationAngle 引脚。
-
设置轴心: 将常量
0连接到 PivotPoint(枢轴点)引脚。 -
输入向量: 将法线贴图的
RGB输出,连接到 Position 引脚。 -
⚠️ 相加补偿(易错点):
RotateAboutAxis节点原本是为顶点偏移设计的,它输出的不是最终位置,而是偏移量 。因此,你必须用一个Add节点,将原始法线的RGB与RotateAboutAxis的输出结果相加,才是最终正确的法线

方法二:使用 Sine / Cosine 数学节点(极致性能、纯二维旋转)
通过观察RotateAboutAxis绕(0,0,1)轴旋转,
不难发现,法线贴图的 Z 轴(蓝色通道(0,0,1))在平面旋转时其实是不变的,我们只需要旋转 X 和 Y(红、绿通道)。

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

核心逻辑:
利用二维向量旋转公式:
NewX = X * Cos(角度) - Y * Sin(角度)NewY = X * Sin(角度) + Y * Cos(角度)
在虚幻引擎的材质编辑器 中,Sine 和 Cosine 节点的默认周期是 1.0 。这极其方便,意味着可以直接把 CustomRotator 的 0~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个加法。