DirectX 12 – Normal Mapping 法线映射

第九章中,我们介绍了贴图映射,通过该技术,我们可以将图像中的细节映射到网格模型的三角形上。然而,我们的法线向量仍存储在顶点中,之后被插值到三角形的各个像素。在本章节中,我们将学习如何以更高的分辨率来设置物体表面的法线向量。这也意味着物体将拥有更为精细的光影效果,却不需要增加顶点或者三角形数量。

目标:

1. 理解为什么我们需要法线映射。

2. 了解如何存储法线映射贴图。

3. 学会如何创建法线映射贴图。

4. 学习法线映射贴图中法线向量所处的坐标系,并了解它是如何与物体的坐标系相关联的。

5. 学会如何在顶点着色器以及像素着色器实现法线映射。

19.1 动机

下图为之前章节demo的截图。锥形物体表面的镜面反射高光看起来很不自然,因为它的贴图表面它是砖块表面,但从截图来看,它的表面极为光滑。在demo中,我们只是应用了砖块贴图,但光照相关的计算仍然是基于顶点插值的法线向量,而不是给予贴图的数据。因此,光照效果并不能与贴图相“对应”。

理论上来说,我们需要将网格模型的几何体进行tessellate,这样砖块的凹凸不平就能由几何体进行模拟。之后,光照的效果将会与贴图相“对应”。硬件端的tessellation可以解决一部分问题,但我们仍然需要一种方法来确定tessellate的顶点的法线向量(使用插值的法线并不会增加法线的精确性)。

另一个可行的解决办法是将光照细节直接存入贴图。但是这样的话,我们就无法使用动态灯光了。

因此,我们的目标是找到一种方法,即使在使用动态灯光的情况下,还是能够展示贴图与光照的细节。由于贴图已经给予了模型更为精细的细节,所以我们也能通过贴图映射的方法解决这个问题。下图展示了,拥有法线映射贴图的物体;很明显,现在物体的光照效果更贴合其贴图。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据