【问题标题】:Normalizing a vector error in HLSL规范化 HLSL 中的向量错误
【发布时间】:2011-11-22 20:33:37
【问题描述】:

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

我正在使用 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 调试时,它告诉我“无法将指令映射到像素着色器指令集”

【问题讨论】:

  • 错误是什么?这是在像素还是顶点着色器中?您确定您的 GPU 已有 10 年历史且仅支持 1.1 吗?我认为这些旧平台没有经过太多测试,因此很可能是编译器错误。
  • 它的每一点都可以在这里找到riemers.net/eng/Tutorials/DirectX/Csharp/Series3/… 我不认为我的 GPU 已经使用了 10 年,但我检查了 DevCaps.VertexShaderVersion,它给了我 1.1。关于错误,它在像素着色器中,它在我加载我的 .fx 文件(在 c# 中)的行上给了我一个错误
  • 这个错误似乎没有什么具体的,它只是说“应用程序中的错误”。经过相当多的实验后,似乎在使用 v1.1 时,您无法在方法中对该方法传入的变量执行 sqrt()。即使使用将参数中变量的值分配给的新变量,也会出错。
  • sqrt(dot(a, a))(对于常量a)起作用的原因是编译器在构建过程中预先计算了它(常量折叠)。对于非常量的v,编译器似乎无法将sqrt(dot(v, v)) 转换为有效的着色器。着色器方法是内联的,所以从技术上讲,问题在于v 映射到一个寄存器,而不是一个参数。您可以尝试使用命令行着色器编译器(DirectX SDK 中的 fxc)来查看是否可以获得更具描述性的错误消息。
  • 好吧,过了一会儿我得到了 fxc 来调试它(普通的 fxc 不支持 ps1.x),它告诉我“无法将指令映射到像素着色器指令集”

标签: hlsl normalize


【解决方案1】:

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

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

也就是说,这可能不是错误。

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

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

【讨论】:

  • 经过更多研究后,我相信它只是不受支持。这似乎令人难以置信,因为这使得像素着色器在旧版本中几乎毫无用处。
  • +1 谢谢 :-) (顺便说一句,如果你可以更换你的 GPU,至少接受 2.0 或 3.0 的 GPU 应该非常便宜,即不是笔记本电脑)
猜你喜欢
  • 2015-01-10
  • 1970-01-01
  • 2011-06-08
  • 2014-07-13
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 2015-05-26
相关资源
最近更新 更多