首页 > 解决方案 > HLSL:当我将 3x3 矩阵“挤压”成 3x2 矩阵时会发生什么?

问题描述

最初我认为这只是意味着最后一列被简单地丢弃,但显然当我进行这样的转换时,我得到了不同的结果,而不是仅仅声明一个 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);

标签: unity3dmatrixhlslshaderlab

解决方案


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

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

推荐阅读