昨天开始写一些经典的Shader来练手,被一个数学问题难住了,把一个Vertex的Position从World Space转到 View 或者 Projection,我们只要执行 mul(pos, worldView) 或者mul(pos, worldViewProjection)就好了,但Vector如果通过这样的运算之后,得出来的结果是明显不正确的,为了解决这个问题,翻了一下大一的线性代数,推导了一下,得出公式,下面来严格的推导一次。
这个运算主要用在Object Space的坐标系和Tangent Space的坐标系的转换,用一个3*3的Matrix去处理一个Vector的结果大概如下:
变换之后方向明显不对了。
然后我们可以这样考虑:在Tangent Space上面, Tangent和Normal是垂直的,即有 N·T = 0
存在矩阵M, G,使 T' = M·T, N' = G·N,且 N'·T' = 0
有, N'·T' = (G·N)T·(M·T) = NT·(GT·M)·T= 0 又N·T = NT·T = 0 得 G = (M-1)T
也就是说,Vector的坐标转换矩阵等于Position的转换矩阵的逆矩阵的转置
这样你再去看texture mapping的shader就阔然开朗,”为什么需要这样那样的矩阵呢?“之类的感叹应该尽量减少, 尝试用数学去解决它。
btw,google的信条是算法可以解决一切问题。
我以为,算法和数学是科学的基础,科学是我们的生活方式。