法线贴图的旋转

        书接上回法线贴图的混合

        这次讲法线贴图的旋转。我们有时会旋转基础贴图,这意味着法线贴图要跟着旋转。我们知道在笛卡尔坐标系中,绕x轴逆时针旋转a角,矩阵变换表示为:

R = \begin{pmatrix} cos \alpha &-sin \alpha \\ sin \alpha & cos \alpha \end{pmatrix}

         对应到uv坐标系,变换表示为:

{uv}' = \begin{pmatrix} cos \alpha &-sin \alpha \\ sin \alpha & cos \alpha \end{pmatrix}* uv

        这意味着绕着uv原点逆时针旋转,可以同样作用于法线贴图,但这样的结果是正确的吗?

        实际上不对,法线下一步是通过TBN矩阵变换到世界空间,而TBN矩阵是基于原始的UV方向的,其实就是Tangent(切线)是沿着uv坐标系的u的方向。这意味着上一步计算得到的切线空间的法线必须是基于原始的uv坐标系计算的。但是我们现在采样法线贴图时已经对坐标系进行了旋转。

        第一种解决办法是旋转切线,让切线和uv坐标进行同样的旋转变换,具体为:

{Tangent.xy}' = \begin{pmatrix} cos \alpha &-sin \alpha \\ sin \alpha & cos \alpha \end{pmatrix}* Tangent.xy

        这里的Tangent是ObjectSpace的切线,但是切线变换是在顶点着色器完成的,到片段着色器时只有WorldSpace的切线了,所以这个实现起来比较麻烦,不常用。

        另一种解法是调整法线,既然TBN需要的是旋转前的法线,那么将法线逆旋转回去就可以了。需要用到旋转矩阵的逆:

R^{-1} = \begin{pmatrix} cos \alpha &sin \alpha \\ -sin \alpha & cos \alpha \end{pmatrix}

{Normal.xy}' = \begin{pmatrix} cos \alpha &sin \alpha \\ -sin \alpha & cos \alpha \end{pmatrix}* Normal.xy

        由于旋转变换不改变向量的长度,所以不需要调整Normal.z。 这种方法比较简单,常用。

         

猜你喜欢

转载自blog.csdn.net/paserity/article/details/129854753