为了让您无需浏览我的实际代码,我尝试将问题简化为最简单的形式。使用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;
}
答案 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)
不是hlsl - 具体表示法。相反,它是使用comma operator的标量表达式。就像c和c++一样,表达式从左到右进行计算,在这种情况下会得到值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;