学习目标
你要能够解释什么
能说清模型空间、世界空间、观察空间与切线空间的职责,并解释 TBN 为什么要正交化。
Interview evidence
题库练习
把这一节课的画面证据,接回 PDF 里的原题。先做一个小预测,再去题目页整理成自己的回答。
-
Normal Map 空间
先自己猜:这道题在考什么?
参考答案:Object Space 法线把方向写在物体坐标里,旋转或复用时不灵活;Tangent Space 把贴图 RGB 当作局部 T/B/N 基里的箭头,运行时变换到世界空间,因此更适合可变形和重复使用的游戏资产。代价是切线、镜像 UV 和缩放约定必须一致。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
实验循环
按顺序做一次实验
-
Step 1
先看几何法线
- 改什么
- Debug = geometric normal
- 怎么做
- 关闭法线贴图,只保留几何法线。
- 你会看到
- 光照连续,模型旋转不会改变局部明暗规律。
- 它代表
- 基线先证明顶点法线和光照空间是一致的。
Code anchor · normal-spaces.frag.glsl · worldNormal
-
Step 2
打开 TBN 扰动
- 改什么
- Normal strength 0 → 1
- 怎么做
- 在切线空间法线与几何法线之间逐步混合。
- 你会看到
- 细节随切线方向出现,而不是跟屏幕方向走。
- 它代表
- 法线贴图的 RGB 只是局部坐标中的方向,需要 TBN 才能参与世界空间光照。
Code anchor · normal-spaces.frag.glsl · TBN
-
Step 3
故意使用错误空间
- 改什么
- Space = tangent / world / view
- 怎么做
- 让同一向量走错矩阵,比较模型旋转后的结果。
- 你会看到
- 高光会粘在屏幕或随模型漂移。
- 它代表
- 空间错误的特征是变换后不再保持预期的不变量。
Code anchor · normal-spaces.frag.glsl · space debug
快速复习
用三分钟找回因果链
这里没有第二套答案。以下内容直接来自上面的课程事实,方便你在面试前快速检索。
一句话核心
用同一张法线贴图在 tangent、world、view 三种解释之间切换,观察错误如何变成可诊断的光照偏差。
- 基线先证明顶点法线和光照空间是一致的。
画面证据:光照连续,模型旋转不会改变局部明暗规律。
- 法线贴图的 RGB 只是局部坐标中的方向,需要 TBN 才能参与世界空间光照。
画面证据:细节随切线方向出现,而不是跟屏幕方向走。
- 空间错误的特征是变换后不再保持预期的不变量。
画面证据:高光会粘在屏幕或随模型漂移。
代码定位
- normal-spaces.frag.glsl · worldNormal
- normal-spaces.frag.glsl · TBN
- normal-spaces.frag.glsl · space debug