规范化HLSL中的向量错误

时间:2011-11-08 21:35:58

标签: hlsl normalize

我已经完全重写了第一篇文章,以便更好地展示问题所在。

我正在使用ps v1.4(我支持的最高版本)并且一直收到错误 每当我使用任何类型的函数(如cos,dot,distance,sqrt,normalize等)传递到像素着色器中时,就会发生这种情况。
例如,我需要“normalize(LightPosition - PixelPosition)”来在我的pixelhader中使用点光源,但normalize会给我一个错误。
有些事要注意 -
我可以使用诸如pow,abs和radians之类的东西而没有错误 如果在从顶点着色器传递的内容上完成,则只有一个错误。 (例如,我可以采用本地pixelhader变量的sqrt而没有错误)
我在传入的任何变量上执行函数时出错,甚至是文本坐标,颜色等。
在顶点着色器内部,我可以对传入的任何变量执行所有这些函数,没有错误,只有在像素中我才会收到错误。 从顶点传递到像素着色器的所有值都是正确的,因为如果我使用软件处理而不是硬件,则不会出现错误和完美亮起的场景。
由于规范化向量基本上是我的错误形成的地方,我尝试创建自己的规范化函数 我称之为Norm(LightPosition - PixelPosition),而“Norm”看起来像这样 -

float3 Norm(float3 v)
{
    return v / sqrt(dot(v, v));
}

我仍然得到错误,因为我从技术上说我还在尝试在像素中使用sqrt。

错误不是特定的,它只是在我在C#中加载.fx文件的行中说“应用程序中的错误” 我认为它实际上可能是一个编译错误,因为我必须使用这样的旧版本(vs 1.1和ps 1.4)
使用fxc.exe调试时,它告诉我“无法将指令映射到像素着色器指令集”

1 个答案:

答案 0 :(得分:1)

旧GPU:s并不总是支持任何指令,特别是在像素着色器中。

您可能会在顶点着色器中使用sqrt,但对于旧版本(1.1 !!),片段着色器可能会非常有限。

这可能不是一个错误。

解决方法可能是跳过hlsl并编写自己的汇编程序(但你可能会遇到同样的问题)并模拟sqrt(如果在1.0中可以有2个纹理,可以使用纹理查找和/或插值) :-p)

你当然可以尝试在hlsl中编写一个sqrt-lookup / interpolation但是它也可能太大了(我不记得了,但IIRC 1.1不允许你写很长的着色器)。