从对象空间转换为正常和切线到世界空间?

use*_*784 1 shader cg matrix hlsl game-engine

为了正确地将Normal(不是位置的方向)从Object空间转换为World space,我们将它与Model matrix/_World2Object matrix(在Unity中)的逆相乘.

那么为什么Tangent(它与法线相切并且也是方向 - 它不是一个位置)与Model Matrix/_Object2World(在Unity中)相乘以将其转换为世界空间?

例如:代码:用于在着色器中读取切线空间法线的代码:

o.normalWorld = normalize( mul(v.normal, _World2Object) );
o.tangentWorld = normalize( mul(_Object2World, v.tangent) );
o.binormalWorld = normalize( cross(o.normalWorld, o.tangentWorld) * v.tangent.w );
Run Code Online (Sandbox Code Playgroud)

Gni*_*how 5

通过逆模型矩阵从对象空间到世界空间的转置(因为它与表面正交)来转换法向量,而切向量指定表面上的点之间的方向,因此用模型矩阵进行变换.

(来源:Wikibooks)

为了更好的可视化,我绘制了一个小图像: 正常和切线变换

切线是表面上的方向,因此如果y轴被压扁,它会跟随表面一样(因此使用模型矩阵).

法线是垂直于表面的方向,因此如果y轴被压扁,则它以相反的方式移动以保持垂直(因此使用逆转置模型矩阵).