凹凸映射
凹凸映射就是通过一些特殊的纹理来增加信息量,通过这些附加信息来修改模型表面的法线
有两种实现方法:
- 高度纹理
- 法线纹理
法线纹理
法线纹理直接存储了表面法线,本质就是将法线转换成了颜色存储了起来,算是一种数据可视化了
值得注意的是法线纹理中的法线和模型中法线一点关系都没有,就如球体的法线都是过球心向外的射线,而法线纹理可以由你自己决定(因为是额外的调整信息)
法线的 xyz
分量都在 [-1,1] 之间,而像素的(颜色)分量在 [0,1] 之间
所以存储时需要简单的映射
\[pixel=\frac{normal+1}{2} \]从法线纹理读取数据后,逆映射获取法线
\[nomal = 2*pixel-1 \]法线纹理分为两种:模型空间下的法线纹理、切线空间下的法线纹理
模型空间下的法线纹理
模型空间下的法线纹理五颜六色,所有法线共用一个模型坐标系,朝各个方向的法线都有,映射后颜色差异极大
切线空间下的法线纹理
切线空间是对每个顶点来说的
坐标原点是顶点本身,z 轴是顶点本身(即模型)的法线方向,x 轴是顶点的切线方向,y 轴(又叫副切线)可由其他两轴叉积出来,副切线的方向由切线的w
分量决定
如果顶点没有凹凸效果,即当前顶点在切线空间中的法线就是 z 轴本身(0, 0, 1)
,映射后的为RGB(0.5, 0.5, 1) 浅蓝色
由于凹凸效果一般只要对原法线做微小的变化,所以切线空间下的法线纹理一般都有大面积的蓝色,如下图:
两种法线纹理的优缺点
模型空间:更直观,突变较少,不可压缩
切线空间:可压缩(z
可由xy
推导),
一般使用切线空间下的法线纹理
切线空间下对切线空间的法线纹理的使用
模型空间到切线空间的转换
将光源方向和视角方向转换至切线空间计算
推导 z 值
由于法线都是单位向量,利用三维的勾股定理可求出 z
举个例子 假设读取到上面的RGB(0.5, 0.5 ,1)
如果有压缩就是不存储 z,即读取到(0.5, 0.5)
到这里就已经获取了切线空间下所有光照计算有关的矢量了