2

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

我正在使用 ps v1.4(我支持的最高版本)并不断收到错误消息。
每当我对传递到像素着色器的东西使用任何类型的函数(例如 cos、dot、distance、sqrt、normalize 等)时,都会发生这种情况。
例如,我需要执行“normalize(LightPosition - PixelPosition)”来在我的像素着色器中使用点光源,但 normalize 会给我一个错误。
需要注意的一些事情——
我可以使用 pow、abs 和弧度之类的东西而不会出错。
如果对从顶点着色器传递的某些内容执行此操作,则只会出现错误。(例如,我可以毫无错误地获取本地像素着色器变量的 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 进行调试时,它告诉我“无法将指令映射到像素着色器指令集”

4

1 回答 1

1

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

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

即这可能不是一个错误。

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

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

于 2011-11-22T12:33:37.827 回答