跳到主要内容
normal-spaces · 课程
从引导学习开始

建议顺序 02 · PBR 与光照

Normal Spaces:一根法线到底在哪个空间里

TBN 的价值,是把贴图里的局部方向送回同一个光照坐标系。

用同一张法线贴图在 tangent、world、view 三种解释之间切换,观察错误如何变成可诊断的光照偏差。

未完成

这一课的入口

按你现在的状态开始

内容只有一份。入口只改变阅读顺序,不会把技术结论拆成“简单版”和“专家版”。

直接看代码

空间与数学 · 先找到画面里的对象和方向,再进入空间、符号、公式与代码。

  • 找对象
  • 认表示
  • 换空间
  • 看极值
  • 对公式

引导学习 · 空间与数学

先找到画面里的对象和方向,再进入空间、符号、公式与代码。

  1. 01 找对象
  2. 02 认表示
  3. 03 换空间
  4. 04 看极值
  5. 05 对公式

学习目标

你要能够解释什么

能说清模型空间、世界空间、观察空间与切线空间的职责,并解释 TBN 为什么要正交化。

Interview evidence

题库练习

把这一节课的画面证据,接回 PDF 里的原题。先做一个小预测,再去题目页整理成自己的回答。

  • Q04 concept

    Normal Map 空间

    先自己猜:这道题在考什么?

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

    可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。

实验循环

按顺序做一次实验

  1. Step 1

    先看几何法线

    改什么
    Debug = geometric normal
    怎么做
    关闭法线贴图,只保留几何法线。
    你会看到
    光照连续,模型旋转不会改变局部明暗规律。
    它代表
    基线先证明顶点法线和光照空间是一致的。

    Code anchor · normal-spaces.frag.glsl · worldNormal

  2. Step 2

    打开 TBN 扰动

    改什么
    Normal strength 0 → 1
    怎么做
    在切线空间法线与几何法线之间逐步混合。
    你会看到
    细节随切线方向出现,而不是跟屏幕方向走。
    它代表
    法线贴图的 RGB 只是局部坐标中的方向,需要 TBN 才能参与世界空间光照。

    Code anchor · normal-spaces.frag.glsl · TBN

  3. Step 3

    故意使用错误空间

    改什么
    Space = tangent / world / view
    怎么做
    让同一向量走错矩阵,比较模型旋转后的结果。
    你会看到
    高光会粘在屏幕或随模型漂移。
    它代表
    空间错误的特征是变换后不再保持预期的不变量。

    Code anchor · normal-spaces.frag.glsl · space debug

快速复习

用三分钟找回因果链

这里没有第二套答案。以下内容直接来自上面的课程事实,方便你在面试前快速检索。

一句话核心

用同一张法线贴图在 tangent、world、view 三种解释之间切换,观察错误如何变成可诊断的光照偏差。

  1. 基线先证明顶点法线和光照空间是一致的。

    画面证据:光照连续,模型旋转不会改变局部明暗规律。

  2. 法线贴图的 RGB 只是局部坐标中的方向,需要 TBN 才能参与世界空间光照。

    画面证据:细节随切线方向出现,而不是跟屏幕方向走。

  3. 空间错误的特征是变换后不再保持预期的不变量。

    画面证据:高光会粘在屏幕或随模型漂移。

代码定位

  • normal-spaces.frag.glsl · worldNormal
  • normal-spaces.frag.glsl · TBN
  • normal-spaces.frag.glsl · space debug
打开代码页