HLSL 意外的 ACOS 结果
hlsl unexpected acos result
我发现了一些奇怪的HLSL错误 - 或者Pix在胡说八道:
我有 2 个正交向量:A = { 0.0f, -1.0f, 0.0f } 和 B { 0.0f,0.0f, 1.0f }
如果我使用 HLSL 点函数,输出是 (-0.0f),这是有道理的,但现在该输出的 acos 是 -0.0000675917(这就是 Pix 所说的 - 以及着色器输出),这不是我所期望的;
即使我自己计算点积(A.x*B.x + A.y * B.y + 等),结果仍然是 0.0f,但我的结果的 acos 不为零。
我确实需要 acos 的结果尽可能精确,因为我想根据三角形法线和给定向量之间的角度为顶点着色。
float4 PS_MyPS(VS_OUTPUT input) : COLOR
{
float Light = saturate(dot(input.Normal, g_LightDir)) + saturate(dot(-input.Normal, g_LightDir)); // compute the lighting
if (dot(input.Vector, CameraDirection) < 0) // if the angle between the normal and the camera direction is greater than 90 degrees
{
input.Vector = -input.Vector; // use a mirrored normal
}
float angle = acos(0.0f) - acos(dot(input.Vector, Vector));
float4 Color;
if (angle > Angles.x) // Set the color according to the Angle
{
Color = Color1;
}
else if (angle > Angles.y)
{
Color = Color2;
}
else if (angle >= -abs(Angles.y))
{
Color = Color3;
}
else if (angle >= Angles.z)
{
Color = Color4;
}
else
{
Color = Color5;
}
return Light * Color;
}
它适用于 0.01 度以上的角度,但对于较小的值,会给出错误的结果。
我发现的其他错误是:hlsl 中的"length"函数为 Pix 中的向量 (0, -0, -0, 0) 返回 1,该向量上的 HLSL 函数"any"也返回 true。这意味着 -0.0f != 0.0f。
有没有其他人遇到过这些,也许有解决我的问题的方法?我在Intel HD Graphics 4600和Nvidia卡上进行了测试,结果相同。
acos 可能返回错误结果的主要原因之一是,请始终记住 acos 的值介于 -1.0 和 1.0 之间。
因此,如果该值略微超过(1.00001 而不是 1.0),则可能会返回不正确的结果。
我通过强制上限来处理这个问题,即检查
if(something>1.0)
something = 1.0;
else if(something<-1.0)
something = -1.0;
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 为什么 acos() 在使用点积的结果时会导致"nan(ind)"?
- acos(double) 在 x64 和 x32 Visual Studio 上给出不同的结果
- HLSL 意外的 ACOS 结果