1
0
mirror of https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git synced 2025-08-23 04:35:28 +08:00

Merge pull request #116 from hyc0612/patch-1

Update 04 Normal Mapping.md
This commit is contained in:
K
2019-02-03 14:09:47 -05:00
committed by GitHub

View File

@@ -222,9 +222,9 @@ void main()
}
```
我们先将所有TBN向量变换到我们所操作的坐标系中现在是世界空间我们可以乘以model矩阵。然后我们创建实际的TBN矩阵直接把相应的向量应用到mat3构造器就行。注意如果我们希望更精确的话就不要TBN向量乘以model矩阵而是使用法线矩阵但我们只关心向量的方向不会平移也和缩放这个变换。
我们先将所有TBN向量变换到我们所操作的坐标系中现在是世界空间我们可以乘以model矩阵。然后我们创建实际的TBN矩阵直接把相应的向量应用到mat3构造器就行。注意如果我们希望更精确的话就不要TBN向量乘以model矩阵而是使用法线矩阵但我们只关心向量的方向不会平移也和缩放这个变换。
从技术上讲顶点着色器中无需副切线。所有的这三个TBN向量都是相互垂直的所以我们可以在顶点着色器中T和N向量的叉乘自己计算出副切线vec3 B = cross(T, N);
从技术上讲顶点着色器中无需副切线。所有的这三个TBN向量都是相互垂直的所以我们可以在顶点着色器中T和N向量的叉乘自己计算出副切线vec3 B = cross(T, N);
现在我们有了TBN矩阵如果来使用它呢基本有两种方式可以使用我们会把这两种方式都说明一下
我们可以用TBN矩阵把所有向量从切线空间转到世界空间传给像素着色器然后把采样得到的法线用TBN矩阵从切线空间变换到世界空间法线就处于和其他光照变量一样的空间中了。
@@ -387,7 +387,7 @@ vector<Texture> specularMaps = this->loadMaterialTextures(
关于法线贴图还有最后一个技巧要讨论,它可以在不必花费太多性能开销的情况下稍稍提升画质表现。
当在更大的网格上计算切线向量的时候,它们往往有很大数量的共享顶点,当发下贴图应用到这些表面时将切线向量平均化通常能获得更好更平滑的结果。这样做有个问题就是TBN向量可能会不能互相垂直这意味着TBN矩阵不再是正交矩阵了。法线贴图可能会稍稍偏移但这仍然可以改进。
当在更大的网格上计算切线向量的时候,它们往往有很大数量的共享顶点,当法向贴图应用到这些表面时将切线向量平均化通常能获得更好更平滑的结果。这样做有个问题就是TBN向量可能会不能互相垂直这意味着TBN矩阵不再是正交矩阵了。法线贴图可能会稍稍偏移但这仍然可以改进。
使用叫做*格拉姆-施密特*正交化过程Gram-Schmidt process的数学技巧我们可以对TBN向量进行重正交化这样每个向量就又会重新垂直了。在顶点着色器中我们这样做