HLSL Dot产品返回意外结果

时间:2013-02-12 12:32:44

标签: shader hlsl

为了让您无需浏览我的实际代码,我尝试将问题简化为最简单的形式。使用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;

}

2 个答案:

答案 0 :(得分:2)

以下内容来自另一个论坛:

问题在于你定义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};

我不确定()符号的确切含义,但它似乎评估了三者的最后一个值(然后将该值分配给向量的所有组件)。

答案 1 :(得分:0)

(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;