Unity3d HLSL:当我;“压扁”;将3x3矩阵转换为3x2矩阵?

Unity3d HLSL:当我;“压扁”;将3x3矩阵转换为3x2矩阵?,unity3d,matrix,hlsl,shaderlab,Unity3d,Matrix,Hlsl,Shaderlab,起初我认为这只是意味着最后一列被简单地丢弃,但显然,当我进行这种转换时,我得到的结果与仅仅声明一个3x2矩阵不同 float3x3 TBN = float3x3(IN.tangent, IN.binormal, IN.normal); float3x2 TB = float3x2(IN.tangent, IN.binormal); half2 vNormalTBN = mul(sampledNormal, (float3x2)TBN); half2 vNormalTB = mul(samp

起初我认为这只是意味着最后一列被简单地丢弃,但显然,当我进行这种转换时,我得到的结果与仅仅声明一个3x2矩阵不同

float3x3 TBN = float3x3(IN.tangent, IN.binormal, IN.normal);
float3x2 TB  = float3x2(IN.tangent, IN.binormal);

half2 vNormalTBN = mul(sampledNormal, (float3x2)TBN);
half2 vNormalTB  = mul(sampledNormal, TB);

我绝对不是着色器专家,所以这只是一个非常疯狂的猜测,可能是完全错误的^^

Afaik矩阵中的组件按列(垂直)排列,看起来有点像

IN.tangent.x IN.binormal.x IN.normal.x
IN.tangent.y IN.binormal.y IN.normal.y
IN.tangent.z IN.binormal.z IN.normal.z
在内存方面,它只是以9个浮点数的顺序存储

因此,当您明确地使用
float3x2
构造函数时,类似于

IN.tangent.x IN.binormal.x
IN.tangent.y IN.binormal.y
IN.tangent.z IN.binormal.z
然而,当您简单地键入时,我怀疑您只是简单地切断了最后3个浮点值,并强制着色器将现在的6个浮点数组解释为一个新的
float3x2
矩阵,它现在可能看起来像

IN.tangent.x  IN.binormal.x
IN.normal.x   IN.tangent.y
IN.binormal.y IN.normal.y

我绝对不是着色器专家,所以这只是一个非常疯狂的猜测,可能是完全错误的^^

Afaik矩阵中的组件按列(垂直)排列,看起来有点像

IN.tangent.x IN.binormal.x IN.normal.x
IN.tangent.y IN.binormal.y IN.normal.y
IN.tangent.z IN.binormal.z IN.normal.z
在内存方面,它只是以9个浮点数的顺序存储

因此,当您明确地使用
float3x2
构造函数时,类似于

IN.tangent.x IN.binormal.x
IN.tangent.y IN.binormal.y
IN.tangent.z IN.binormal.z
然而,当您简单地键入时,我怀疑您只是简单地切断了最后3个浮点值,并强制着色器将现在的6个浮点数组解释为一个新的
float3x2
矩阵,它现在可能看起来像

IN.tangent.x  IN.binormal.x
IN.normal.x   IN.tangent.y
IN.binormal.y IN.normal.y

哦,谢谢你的回答,这是有道理的,但是对于这样一个混合矩阵,它的可能用途真的令人困惑。我的问题的背景是Witcher 3游戏中的一个反向工程月亮着色器,如世界空间TBN矩阵被转换成3x2矩阵的部分所述。我不知道,正如我所说的,这只是一个猜测。。。如果这是真的,那绝对没有用^^你就不应该使用演员阵容哦,谢谢你的回答,这是有道理的,但是对于这样一个混合的矩阵,它的可能用途真的令人困惑。我的问题的背景是Witcher 3游戏中的一个反向工程月亮着色器,如世界空间TBN矩阵被转换成3x2矩阵的部分所述。我不知道,正如我所说的,这只是一个猜测。。。如果这是真的,那绝对没有用^^那么你就不应该使用演员阵容