法线贴图

表面光滑的法线:在三角形的三个顶点法向量之间进行平滑插值来得到三角形上每个点的法向量。

法线贴图:从‘法线贴图’上进行采样得到对应的法线方向,表面上的所有法向量都是可以被计算并且存储在法线贴图中。在片段着色器阶段进行光照计算的时候,每个像素的特定法线也是根据纹理坐标采样来获取使用。

切线空间:坐标系需要三个正交单位向量。物体表面确定了原法线后会有多个切线X和副切线Y,由于新法线是2D纹理的的一部分,而2D纹理有两个正交单位向量U和V,因此通常做法是将X分量对应到U轴(Tangent),而Y分量对应到V轴在(Bitangent),将切线方向与纹理空间对齐。由原法线、与纹理空间对齐的切线和副切线组成的矩阵是TBN矩阵,该矩阵向量定义的坐标系是切线空间。

法线纹理:对于新法线,即使是在非常凹凸不平的表面,仍然认为法线的方向是从纹理朝外的。在切线空间定义法向量,并存储在纹理的RGB文素中。Z分量主导的一个分量,X和Y分量只能起到让其略微倾斜的作用。将XYZ向量存储在RGB文素中会使得法线纹理偏蓝色。但是法线坐标[-1,1]需要变成rgb文素[0,1]。

切线和副切线的计算:

img

找到物体本地空间下的向量T(表示tangent)和B(表示bitangent),可以看到两个三角形边E1和E2可以写成T和B的线性组合:

img

也可以写成下面的形式:

img

现在可以很容易的转换成矩阵公式的形式:

img

现在想把矩阵转换到等式的右边,为此可以两边乘以上面标红的矩阵的逆矩阵:

img

计算如下:

img

算出逆矩阵的值得到:

img

​ 对每一个三角形执行上述过程,可以为每个三角形通过三角形的边和UV坐标计算出tangent向量和bitangent向量(对三角形的三个顶点来说这两个向量都是一样的)。通常的做法是为每一个顶点都保存一个tangent/bitangent值,每个顶点的tangent/bitangent值由共享这个顶点的所有三角面的平均tangent/bitangent值确定(这与顶点法线是一样的)。这样做的原因是使整个三角面的效果比较平滑,防止相邻三角面之间的不平滑过渡。这个坐标系空间的第三个分量——法线分量,是tangent和bitangent的叉乘积。

向着色器中将法线数组、切线数组和副切线数组作为顶点属性传入着色器,同时用GLuint类型变量加载法线纹理。

在顶点着色器中新增代码:

计算都摄像机空间中做,因为在这一空间中更容易获取片段坐标。使用3*3的模型视图矩阵乘T、B、N向量:

1
2
3
vec3 vertexTangent_cameraspace = MV3x3 * vertexTangent_modelspace;
vec3 vertexBitangent_cameraspace = MV3x3 * vertexBitangent_modelspace;
vec3 vertexNormal_cameraspace = MV3x3 * vertexNormal_modelspace;

这三个向量确定了TBN矩阵,此矩阵是从世界空间到MV下的切线空间的变换:

1
2
3
4
mat3 TBN = transpose(mat3(
vertexTangent_cameraspace,
vertexBitangent_cameraspace,
vertexNormal_cameraspace ));

利用它计算切线空间中的光线方向和视线方向:

1
2
LightDirection_tangentspace = TBN * LightDirection_cameraspace;
EyeDirection_tangentspace = TBN * EyeDirection_cameraspace;

在片段着色器中添加如下代码:

先获取法线数据,从rgb的[0,1]变换到齐次坐标的[-1,1],再进行归一化作为计算光照的n向量。由于该n向量是在切线空间计算的,因此为了保证计算都在同一个空间进行,需要在顶点着色器中相关参数TBN矩阵:

1
vec3 TextureNormal_tangentspace = normalize(texture( NormalTextureSampler, UV ).rgb*2.0 - 1.0);
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信