首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hlsl意外acos结果

hlsl意外acos结果
EN

Stack Overflow用户
提问于 2013-10-24 23:20:20
回答 1查看 989关注 0票数 0

我发现了一些奇怪的HLSL错误--或者说Pix在胡说八道:

我有两个正交向量: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的结果尽可能精确,因为我想根据三角形法线和给定向量之间的角度对顶点进行着色。

代码语言:javascript
复制
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度以上的角度,但对于较小的值会给出错误的结果。

我发现的其他错误是:对于Pix中的向量(0,-0,-0,0),hlsl中的“长度”-function返回1,该向量上的HLSL函数"any“也返回true。这意味着-0.0f != 0.0f。

有没有其他人遇到过这些问题,也许有解决我的问题的办法?我在Intel HD Graphics 4600和Nvidia显卡上进行了测试,结果相同。

EN

回答 1

Stack Overflow用户

发布于 2013-10-24 23:44:43

acos可能返回错误结果的主要原因之一是,始终记住acos采用的值介于-1.0和1.0之间。

因此,如果该值稍微超过(1.00001而不是1.0),它可能会返回错误的结果。

我通过强制封顶来处理这个问题,即检查

代码语言:javascript
复制
if(something>1.0)
   something = 1.0;
else if(something<-1.0)
   something = -1.0;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19569984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档