实现凹凸映射有两种主要的方法:
1.一种是使用一张高度纹理来模拟表面位移,得到一个修改后的法线值,这种称作为高度映射。
高度纹理使用一张高度图来实现凹凸映射,存储强度值,用于模拟表面局部的海拔高度,颜色越浅说明越向外边突起。
看起来直观,缺点是运算复杂,需要消耗更多的性能。
高度图通常会和法线映射一起使用,用于给出表面凹凸的额外信息。也就是说我们通常使用法线映射来修改光照。
2.第二种使用一张法线纹理,直接存储表面法线,这种叫法线映射。
法线纹理存储的就是表面的法线方向,此时需要进行映射(因为法线分量范围[-1,1],而像素分量范围[0,1]),映射为 pixel=(normal+1)/2。
从像素变回法线时反映射 normal=pixel×2-1。
此时法线有两种存储方式:
(1.模型空间的法线纹理,即在模型空间的表面法线存储在一张纹理中。此时法线方向各异,所以存储的纹理颜色各异。
(2.切线空间的法线纹理,即将顶点各自的切线空间中的法线方向存储在一张纹理中。此时切线空间的法线方向就是Z轴方向(也就是说都是(0,0,1),映射后也都相同),所以存储的颜色近乎都是蓝色。同时大量存在的蓝色也说明,大部分法线是和顶点的模型空间法线是一样的,不需要更改。(可以这样理解:改变的颜色的部分就是实现凹凸效果的部分)
各自的优缺点:
模型空间的法线纹理:1简单直观、2可以提供平滑的边界。
切线空间的法线纹理:1自由度高、2可以直接应用到不同的网格上,也可以得到合理结果、3可以进行UV动画,实现凹凸移动效果、4可以重重用法线纹理(节省空