【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个加法。
相关推荐
threelab18 分钟前
Three.js 极光效果着色器 | 三维可视化 / AI 提示词
javascript·人工智能·着色器
天天进步201522 分钟前
魔音漫创源码解析:性能优化: Electron 环境下的图片管理与文件系统协议处理优化
javascript·性能优化·electron
solo_9915 小时前
使用Perfetto debug trace查看超时slice
性能优化
黄俊懿20 小时前
复合索引设计指南:最左前缀 & 字段排座次
数据库·sql·mysql·adb·性能优化·dba·db
吴梓穆20 小时前
UE5 脚部IK
ue5
源远流长jerry20 小时前
Linux 网络性能优化:从应用到内核
linux·运维·服务器·网络·网络协议·性能优化
屯子来了20 小时前
Windows + VS2022 + UE5.2 编译 Fast DDS 2.14.0 完整记录
c++·ue5·fastdds
ChaITSimpleLove1 天前
优化 WSL2 性能:为 Docker 和 K8s 定制高效内存配置指南
docker·容器·性能优化·kubernetes·wsl2·windows开发·pwsh
MU在掘金916951 天前
源码归因:从耗时方法到项目源码
性能优化
薪火铺子1 天前
ElasticSearch 聚合查询与性能优化实战
大数据·elasticsearch·性能优化