当前位置:   article > 正文

unity shader 自己构造切线空间到世界空间矩阵为何右乘?_unity 切线空间转世界空间

unity 切线空间转世界空间

以下代码摘抄至SpaceTransform.hlsl,举例如下:

real3 TransformTangentToWorld(float3 normalTS, real3x3 tangentToWorld, bool doNormalize = false)
{
    // Note matrix is in row major convention with left multiplication as it is build on the fly
    real3 result = mul(normalTS, tangentToWorld);
    if (doNormalize)
        return SafeNormalize(result);
    return result;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

float3 normalWS = TransformTangentToWorld(Normal, half3x3(WorldTangent, WorldBiTangent, WorldNormal));
自定义的half3x3 是行优先的,也就是第一行是切线,第二行是副切线,第三行是法线,但我们需要列矩阵。就是需要转置矩阵,转置矩阵等于逆矩阵,这里最简单的实现方法就是左乘变右乘。而unity内置的矩阵是列矩阵,可以直接左乘,如下:

float3 TransformObjectToWorld(float3 positionOS)
{
    #if defined(SHADER_STAGE_RAY_TRACING)
    return mul(ObjectToWorld3x4(), float4(positionOS, 1.0)).xyz;
    #else
    return mul(GetObjectToWorldMatrix(), float4(positionOS, 1.0)).xyz;
    #endif
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/649751
推荐阅读
相关标签
  

闽ICP备14008679号