【问题标题】:float3x3 multiplication not working as expected in hlslfloat3x3 乘法在 hlsl 中没有按预期工作
【发布时间】:2023-02-17 15:53:11
【问题描述】:

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

这按预期工作:

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

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

【问题讨论】:

  • 为什么你认为这是错误的?您正在做的事情也可以简化为o.vertex = UnityObjectToClipPos(float4(v.vertex.xyz, v.vertex.w));
  • 单位矩阵应该无关紧要,但我很确定矩阵应该是 mul() 调用中的第一个参数。否则向量会被转置矩阵变换。
  • @Daniel - 我认为它应该是一样的,但第二个代码 sn-p 不起作用,我想知道为什么。
  • @Louis Ingenthron - 文档说在这种情况下向量被转置。使用身份矩阵我认为这无关紧要

标签: unity3d matrix shader hlsl


【解决方案1】:

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

【讨论】: