Matrix 不是';对象空间中的t法线(从法线语义读取)?

Matrix 不是';对象空间中的t法线(从法线语义读取)?,matrix,unity3d,shader,Matrix,Unity3d,Shader,将法线从对象空间转换到世界空间时,预定义的矩阵_Object2World像一个符咒一样工作:(mul(_Object2World,normal))。旋转和缩放(一致地)都通过行和列中的颜色检查元素给出了预期的矩阵,但是为什么有些代码使用法线左乘逆矩阵_World2Object进行对象空间转换,是因为统一版本(我使用4.5.2)或者法线确实存在于对象空间以外的其他空间中,为什么这两个矩阵不响应非均匀缩放 法线(从法线语义读取)不在对象空间中吗 是的 法线确实存在于对象空间以外的其他空间中,并且 为

将法线从对象空间转换到世界空间时,预定义的矩阵_Object2World像一个符咒一样工作:(mul(_Object2World,normal))。旋转和缩放(一致地)都通过行和列中的颜色检查元素给出了预期的矩阵,但是为什么有些代码使用法线左乘逆矩阵_World2Object进行对象空间转换,是因为统一版本(我使用4.5.2)或者法线确实存在于对象空间以外的其他空间中,为什么这两个矩阵不响应非均匀缩放

法线(从法线语义读取)不在对象空间中吗

是的

法线确实存在于对象空间以外的其他空间中,并且 为什么这两个矩阵不响应非均匀缩放

不,空间是相同的,但在一般情况下(不是统一的),non不能正确变换法线

如果要在一般情况下执行正确的法线变换,则需要使用逆转置矩阵。(在unity着色器中,这相当于
mul(正常,\u world2对象)

_Object2World的工作方式就像一个符咒:(mul(_Object2World,normal))。旋转和缩放(一致)都给出了预期的矩阵 行和列中的颜色检查元素

这有点难以解释(我希望能正确地记住它)。 您可以假设缩放始终是一致的,因为
Unity
(至少在4.x版本之前。我认为它将在5.x版本中更改)不会在顶点着色器中应用非一致缩放,而是对网格CPU端进行预变换

为着色器提供以下制服:

  • \u Object2World
    :包含世界矩阵,包括比例
  • unity\u Scale
    :w分量包含均匀比例因子的倒数(
    w=1/Scale
  • \u world2对象
    :包含不带比例的反向世界矩阵
为了正确地将法线从对象变换到世界空间,有3种可能性:

  • 变换缩放的法线
    float3-worldN=mul((float3x3)\u Object2World,scaled\u-normal);
  • 如果在变换后对法线进行规格化,则可以避免使用缩放法线(可能是您的情况,否则变换不应100%正确)
  • 使用反向转置
    mul(正常,世界2对象)
SCALED_NORMAL
的定义如下:

#define SCALED_NORMAL (v.normal * unity_Scale.w)