跳到主要内容
腾讯题库 · Q04
先读 30 秒回答

第 04 题 / 50

学习状态 未开始

Normal Map 空间

面试官问

PDF 第 8 页

请说明法线贴图(Normal Map)在 Tangent Space 与 Object Space 中的区别,为何游戏引擎普遍采用 Tangent Space?(必问题,理清逻辑)

概念理解 normal-map · tangent-space 对应课程:normal-spaces

先把问题答上

你可以直接这样回答

约 30 秒

Object Space 法线把方向写在物体坐标里,旋转或复用时不灵活;Tangent Space 把贴图 RGB 当作局部 T/B/N 基里的箭头,运行时变换到世界空间,因此更适合可变形和重复使用的游戏资产。代价是切线、镜像 UV 和缩放约定必须一致。

这道题真正想听什么?

先确认比较对象和回答边界,再决定要不要展开公式、工程实现或性能取舍。

它考的是“这三个 RGB 数字到底在哪个坐标系里”。Tangent Space 把红/绿/蓝看成沿模型的切线 T、副切线 B、几何法线 N 的局部方向;Object Space 直接把方向写在物体坐标中。Tangent Space 可以让同一张细节贴图随模型变形、旋转而复用,所以更适合游戏资产;代价是需要可靠的切线、镜像 UV 符号和导入约定。

把答案讲到 2 分钟面试必答 · 约 2 分钟 · 补足因果、输入和取舍

我会用 N_world = normalize(T*n.x+B*n.y+N*n.z) 解释数据流,再用 N·L debug 证明法线改变的是光照而不是轮廓。测试要覆盖非均匀缩放、镜像 UV、不同切线生成器和颜色空间。看到接缝时先查 TBN/handedness,不要先把法线强度拉满。

面试官可能继续追问什么?补充自测 · 约 3 分钟 · 检查自己是不是真的懂了
  • 问:为什么不全用 Object Space? 答:Object Space 的颜色方向绑定某个物体朝向,旋转/变形或复用贴图时需要重烘焙;Tangent Space 只记录局部凹凸,资产更可复用。
  • 问:Tangent Space 一定没有问题吗? 答:不是。切线生成、MikkTSpace 约定、镜像 UV 与非均匀缩放都可能让基不正交,必须用 debug 验证。
  • 因果链: 采样 RGB → 解码到局部方向 → TBN 变换 → N·L 改变亮暗。法线贴图改变的是局部朝向,不应改变 silhouette。
如果概念还是悬空,就去做实验关键证据 · 约 5–15 分钟 · 预测 → 单变量 → 观察

实验不是第二份答案,它只负责证明答案

如果上面的解释已经听懂,可以直接跳过。卡住时,再沿着这三步把抽象词变成画面证据。

  1. 先猜 如果把这个模型或规则关掉,画面里哪一处应该先变?为什么?
  2. 去取证 固定其他条件,只改一个参数。先写下变化,不用“更真实”“更高级”这种空词代替证据。
  3. 再追问为什么 是哪一步造成这个结果?如果结果相反,先检查输入、空间、算法,还是显示输出?
我完全没头绪,给我一个起点

先截下默认状态,只动页面当前开放的那个参数。你只需要说清楚“原来怎样 → 改了什么 → 现在怎样”。

1. 先预测

打开 Normal Spaces Lab,先选 space=tangentpattern=checkernormalStrength=0.55,打开 showBasisdebugMode=tangent。预测:同一张局部波纹贴到球面不同位置,细节会跟着表面走,模型轮廓不变。把 space 切到 object,像把“贴在每块木板上的箭头”换成“全世界统一朝向的箭头”,接缝和旋转会暴露出来。

公式的口语翻译:

N_world = normalize(T * n.x + B * n.y + N * n.z)
B = cross(N, T) * handedness

第一行就是“把法线贴图的局部箭头,分别沿 T/B/N 三根现场坐标轴搬回世界”;第二行说明镜像 UV 时副切线可能要翻面。normalize 是把搬运后的箭头重新拉回单位长度,不然光照点积会被缩放影响。

老师追问

先别急着查答案: 先把术语还原成一个可观察的现象:哪个中间量会变化,哪个结果只是表面现象?

为什么: 你刚才的预测依赖哪个前提?如果把“Normal Map 空间”里最关键的变量或约束关掉,画面/输出会先坏在哪里?

如果结果相反: 先排除哪一层,再谈结论?这个规则的边界是什么?

2. 再动手

Normal Spaces 代码页 依次完成:tangent 基线、showBasis=truemirrorUv=truescale=[1.55,0.68,1.15]。每次只改一个控制:spacenormalStrengthmirrorUvdebugMode,记录 tangent/bitangent/perturbed-normal 颜色和 N·L。把同一相机下的球、平面、环结放在对照表里。

3. 最后对证据

tangent 通道应在表面形成连续的局部方向;打开镜像 UV 后,若没有 handedness 修正,bitangent 会翻转,光照一侧像被掀反。非均匀缩放下,正确的法线矩阵仍保持法线垂直;错误做法会让高光变形,但模型轮廓仍大致相同。normalStrength 只应改变细节起伏,不能让球的外轮廓变厚。

答案在代码哪里发生?实现定位 · 约 3 分钟 · 变量、函数和关键行
完整 5 分钟版本面试扩展 · 约 5 分钟 · 项目边界、验证与降级

资产管线会固定切线空间约定、导入法线格式、绿通道方向和烘焙工具版本,并把球/平面/镜像 UV 作为回归样例。低端设备可降低法线分辨率或关闭细节,但保留几何法线和正确的空间变换。当前 Lab 使用教学几何和程序纹理,不能替代真实 DCC/引擎组合的最终验收。

哪些说法最容易答歪?必看陷阱 · 约 1 分钟 · 面试前最后检查
  • 把 Tangent Space 的 RGB 当世界方向直接使用。
  • 非均匀缩放仍用模型矩阵变换普通法线,忘记逆转置。
  • 忽略镜像 UV 的副切线符号,造成局部光照翻转。
  • normalStrength 解决接缝;强度越大只会把空间错误放大。