1

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

浮动 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;

}

4

2 回答 2

3

以下来自另一个论坛:

问题是您定义 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};

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

于 2013-02-14T20:50:09.487 回答
0

(1.0, 2.0, 3.0)不是特定的表示法。相反,它是一个使用逗号运算符的标量表达式。就像一样,表达式是从左到右计算的,在这种情况下会产生值3.0This 用于float3从单个标量值构造 a ,并将该值复制到所有通道。

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

// 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;
于 2015-12-10T18:27:14.943 回答