【问题标题】:HLSL Dot Product Returning Unexpected ResultsHLSL 点积返回意外结果
【发布时间】:2015-12-11 02:27:14
【问题描述】:

为了让大家不必浏览我的实际代码,我试图将我的问题简化为最简单的形式。使用 HLSL 提供的点函数时,我无法产生预期的结果。在我包含的示例中,我希望两个向量的点积为 26。当我运行此代码时,它将始终返回 45。我将此函数放在像素着色器中,并正在使用着色器模型 2 进行编译。求助! !!

float MyDotProblemSimplified() {

float3 vectorOne = (1.0, 2.0, 3.0);
float3 vectorTwo = (3.0, 4.0, 5.0);
float dotResult = dot(vectorOne, vectorTwo); 
//Expected dotResult: 26
//Actual dotResult 45 
return dotResult;

}

【问题讨论】:

  • 你能不能把它改成float3 vectorOne = float3(1.0f, 2.0f, 3.0f); float3 vectorTwo = float3(3.0f, 4.0f, 5.0f);试试看?我从来没有见过没有这个向量的作业——“构造函数”,也许它有帮助:)
  • 我在几个论坛上发布了这个问题。我发现我需要像这样创建向量:float3 vectorOne = {1.0, 2.0, 3.0};这解决了我的问题。希望这篇文章可以帮助别人。

标签: shader hlsl


【解决方案1】:

以下来自另一个论坛:

问题在于您定义 float3 的方式。

替换

float3 vectorOne = (1.0, 2.0, 3.0);
float3 vectorTwo = (3.0, 4.0, 5.0);

float3 vectorOne = {1.0, 2.0, 3.0};
float3 vectorTwo = {3.0, 4.0, 5.0};

我不确定 () 表示法的确切作用,但它似乎评估为三个中的最后一个值(然后将该值分配给向量的所有组件)。

【讨论】:

  • 或 float3 vectorOne = float3(1.0, 2.0, 3.0);明确
【解决方案2】:

(1.0, 2.0, 3.0) 不是 特定的符号。相反,它是一个使用comma operator 的标量表达式。就像 一样,表达式是从左到右计算的,在这种情况下会产生值3.0 然后用于从单个标量值构造float3,它复制了对所有渠道的价值。

要达到预期的效果,您的选择是:

// option 1:
float3 v = float3(x,y,z);

// option 2:
float3 v = {x,y,z};

// option 3:
float3 v;
v.x = x;
v.y = y;
v.z = z;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多