你可以直接这样回答
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. 先预测
打开 Normal Spaces Lab,先选 space=tangent、pattern=checker、normalStrength=0.55,打开 showBasis 和 debugMode=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=true、mirrorUv=true、scale=[1.55,0.68,1.15]。每次只改一个控制:space、normalStrength、mirrorUv 或 debugMode,记录 tangent/bitangent/perturbed-normal 颜色和 N·L。把同一相机下的球、平面、环结放在对照表里。
3. 最后对证据
tangent 通道应在表面形成连续的局部方向;打开镜像 UV 后,若没有 handedness 修正,bitangent 会翻转,光照一侧像被掀反。非均匀缩放下,正确的法线矩阵仍保持法线垂直;错误做法会让高光变形,但模型轮廓仍大致相同。normalStrength 只应改变细节起伏,不能让球的外轮廓变厚。
答案在代码哪里发生?实现定位 · 约 3 分钟 · 变量、函数和关键行
- TBN 展开:局部法线如何进入世界空间。
- 镜像 UV 的 handedness:解释副切线为什么要带符号。
- 法线对光照的影响 与 debug:区分方向错误和颜色/曝光错误。
完整 5 分钟版本面试扩展 · 约 5 分钟 · 项目边界、验证与降级
资产管线会固定切线空间约定、导入法线格式、绿通道方向和烘焙工具版本,并把球/平面/镜像 UV 作为回归样例。低端设备可降低法线分辨率或关闭细节,但保留几何法线和正确的空间变换。当前 Lab 使用教学几何和程序纹理,不能替代真实 DCC/引擎组合的最终验收。
哪些说法最容易答歪?必看陷阱 · 约 1 分钟 · 面试前最后检查
- 把 Tangent Space 的 RGB 当世界方向直接使用。
- 非均匀缩放仍用模型矩阵变换普通法线,忘记逆转置。
- 忽略镜像 UV 的副切线符号,造成局部光照翻转。
- 用
normalStrength解决接缝;强度越大只会把空间错误放大。