在片段着色器中实现一些向量和矩阵计算失败后,我尝试在顶点着色器中测试基本矩阵计算,以确保万无一失。
这按预期工作:
uniform float4x4 _Identity4x4 = { 1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0 };
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos( mul( v.vertex, _Identity4x4 ));
...
但这会造成破坏:
uniform float3x3 _Identity3x3 = { 1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0 };
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos( float4( mul( v.vertex.xyz, _Identity3x3 ), v.vertex.w));
...
我确定我遗漏了一些重要的东西,但无法弄清楚或在网上找到类似的东西。
所以事实证明矩阵需要是静态的。不确定为什么 4x4 有效而 3x3 不... 可以在here.
中找到基本解释矩阵应该先行(矩阵乘法不可交换:A x B 与 B x A 的结果不同,并且向量也是 3x1 矩阵...) 因此,将您的代码更改为: o.vertex = UnityObjectToClipPos( float4( mul( Identity3x3, v.vertex.xyz ), v.vertex.w)); 瞧