float3x3 乘法在 hlsl 中没有按预期工作

问题描述 投票:0回答:2

在片段着色器中实现一些向量和矩阵计算失败后,我尝试在顶点着色器中测试基本矩阵计算,以确保万无一失。

这按预期工作:

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));
    ...

我确定我遗漏了一些重要的东西,但无法弄清楚或在网上找到类似的东西。

unity3d matrix shader hlsl
2个回答
0
投票

所以事实证明矩阵需要是静态的。不确定为什么 4x4 有效而 3x3 不... 可以在here.

中找到基本解释

0
投票

矩阵应该先行(矩阵乘法不可交换:A x B 与 B x A 的结果不同,并且向量也是 3x1 矩阵...) 因此,将您的代码更改为: o.vertex = UnityObjectToClipPos( float4( mul( Identity3x3, v.vertex.xyz ), v.vertex.w)); 瞧

© www.soinside.com 2019 - 2024. All rights reserved.