归一化 HLSL 中的矢量误差

发布于 2024-12-14 12:12:15 字数 864 浏览 3 评论 0原文

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

我正在使用 ps v1.4(我支持的最高版本)并且不断收到错误。
每当我对传递到像素着色器的东西使用任何类型的函数(例如 cos、dot、distance、sqrt、normalize 等)时,都会发生这种情况。
例如,我需要执行“标准化(LightPosition - PixelPosition)”才能在像素着色器中使用点光源,但标准化给我一个错误。
一些注意事项-
我可以毫无错误地使用 pow、abs 和弧度等内容。
仅当对从顶点着色器传递的内容执行此操作时才会出现错误。 (例如,我可以毫无错误地获取本地像素着色器变量的 sqrt)
我在对传入的任何变量(甚至文本坐标、颜色等)执行函数时收到错误。
在顶点着色器内部,我可以对传入的任何变量执行所有这些函数,不会出现错误,只有在像素着色器中我才会收到错误
从顶点传递到像素着色器的所有值都是正确的,因为如果我使用软件处理而不是硬件,我不会得到任何错误并且场景完美照明。
由于归一化向量本质上是我的错误产生的地方,因此我尝试创建自己的归一化函数。
我调用 Norm(LightPosition - PixelPosition) ,“Norm”看起来像这样 -

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

我仍然收到错误,因为我想从技术上讲我仍在尝试在像素着色器内取 sqrt。

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

I have completely re-written this first post to better show what the problem is.

I am using ps v1.4 (highest version I have support for) and keep getting an error.
It happens any time I use any type of function such as cos, dot, distance, sqrt, normalize etc. on something that was passed into the pixelshader.
For example, I need to do "normalize(LightPosition - PixelPosition)" to use a point light in my pixelshader, but normalize gives me an error.
Some things to note-
I can use things like pow, abs, and radians with no error.
There is only an error if it is done on something passed from the vertex shader. (For example I could take the sqrt of a local pixelshader variable with no error)
I get the error from doing a function on ANY variable passed in, even text coords, color, etc.
Inside the vertex shader I can do all of these functions on any variables passed in with no errors, it's only in the pixelshader that I get an error
All the values passing from the vertex to pixel shader are correct, because if I use software processing rather than hardware I get no error and a perfectly lit scene.
Since normalizing the vector is essentially where my error comes form I tried creating my own normalizing function.
I call Norm(LightPosition - PixelPosition) and "Norm" looks like this -

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

I still get the error because I guess technically I'm still trying to take a sqrt inside the pixelshader.

The error isn't anything specific, it just says "error in application" on the line where I load my .fx file in C#
I'm thinking it could actually be a compiling error because I have to use such old versions (vs 1.1 and ps 1.4)
When debugged using fxc.exe it tells me "can not map instruction to pixel shader instruction set"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

究竟谁懂我的在乎 2024-12-21 12:12:15

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

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

即这可能不是一个错误。

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

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

Old GPU:s didn't always support any instruction, especially in the pixel shader.

You might get away with a sqrt in the vertex shader but for a so old version (1.1 !!) the fragment shader might be extremely limited.

I.e this might not be a bug.

The work around could be to skip the hlsl and write your own assembler (but you might stumble onto the same problem there) and simulate the sqrt (say with a texture lookup and / or interpolations if you can have 2 textures in 1.0 :-p )

You can of course try to write a sqrt-lookup/interpolation in hlsl but it might be too big too (I don't remember but IIRC 1.1 don't let you write very long shaders).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文