参考教程
Tutorial 6: Terrain Normal Mapping
学习记录
这篇文章中我们介绍地形网格的法线贴图,本篇代码基于上一篇,仅有少许的改动。
对地形的法线贴图和之前介绍的单独法线贴图并无区别,我们需要在 TerrainClass 中计算网格三角形的切线副切线,方法如下:
1 | void TerrainClass::CalculateTerrainVectors() |
TerrainClass 的整体声明如下:
1 | //////////////////////////////////////////////////////////////////////////////// |
之后我们需要一个从 LightShaderClass 修改而来的支持切线与副切线数据的 TerrainShaderClass ,声明如下:
1 | //////////////////////////////////////////////////////////////////////////////// |
在 terrain.vs 和 terrain.ps 中使用切线副切线和法线贴图中的数据共同计算光照:
1 | //////////////////////////////////////////////////////////////////////////////// |
最后在 ShaderManagerClass 中增加 TerrainShaderClass 的对象和在 ZoneClass 中使用 TerrainShaderClass 来渲染就可以了。
最终效果如下:

贴近看的话可以看到效果:

源代码:DX11TerrainTutorial-TerrainNormalMap
这篇文章之前我修改了操作逻辑,如今可以使用鼠标来旋转视角,使用 Space 向上 ,Ctrl 向下。