Opengl 浮点变量不以任何方式进行比较

Opengl 浮点变量不以任何方式进行比较,opengl,floating-point,glsl,Opengl,Floating Point,Glsl,我在glsl片段着色器中做了一些事情,得到了一些奇怪的结果。我用于计算的代码现在应该不是真正相关的,但是对于某种“调试”,我会根据变量所在的范围显示颜色 为此编写的代码是: (阴影是一个浮点数) if(阴影==0.0f) { vFragColor=vec4(1.0f,0.0f,0.0f,0.0f); } else if(阴影==1.0f) { vFragColor=vec4(0.0f,1.0f,0.0f,0.0f); } else if(阴影0.0f) { vFragColor=vec4(0.0

我在glsl片段着色器中做了一些事情,得到了一些奇怪的结果。我用于计算的代码现在应该不是真正相关的,但是对于某种“调试”,我会根据变量所在的范围显示颜色

为此编写的代码是: (阴影是一个浮点数)

if(阴影==0.0f)
{
vFragColor=vec4(1.0f,0.0f,0.0f,0.0f);
}
else if(阴影==1.0f)
{
vFragColor=vec4(0.0f,1.0f,0.0f,0.0f);
}
else if(阴影<1.0f&&shadow>0.0f)
{
vFragColor=vec4(0.0f,0.0f,1.0f,0.0f);
}
否则如果(阴影<0.0f)
{
vFragColor=vec4(1.0f,0.0f,1.0f,0.0f);
}
否则如果(阴影>1.0f)
{
vFragColor=vec4(0.0f,1.0f,1.0f,0.0f);
}
其他的
{
vFragColor=vec4(1.0f,1.0f,1.0f,0.0f);
}
根据我的理解,应该不可能在末尾输入“else”,因为之前的代码会检查任何可能的值。 但是发生的是,对于我得到一些奇怪结果的区域,我想进行那种“调试”,代码进入“else”语句


有人知道这是怎么发生的吗?我完全不明白这一点。

浮点也可以是“非数字”

永远不要比较浮点是否完全相等,而是看看2之间的距离是否小于一些delta@ratchetfreak是的,我知道,但是else if语句涵盖了小于0、正好0、介于0和1之间、正好1和大于1的任何内容。。。那么,不管delta与否,代码如何输入最后一个else语句?如果alpha值为0,您如何知道它到达了最新语句?它是完全透明的。@nurgan:float也可以是“非数字”。@ratchetfreak有时比较浮点数是否相等是不合适的,有时则不是。如果你决定“永远”不去比较它们,你就选择了无知和迷信的道路,这对你来说也许是好的,但为什么这对其他人来说是正确的选择呢?不要忘记积极/消极的无限性。这种比较中缺少了两种情况:无穷大和NaN。您可以在GLSL中分别使用
isinf(…)
isnan(…)
进行测试。与NaN不同,+/-Infinity将触发其中的两种情况,但GLSL中没有无穷大常数可用于测试与无穷大相等,因此我想我会打开函数来检查位模式。@AndonM.Coleman:
运算符不应该涵盖无穷大情况吗?是的,这就是为什么我说它触发了其中两个案例。但是如果你想测试无穷大是否相等,那就需要一个特殊的例子。
if(shadow == 0.0f)
{
    vFragColor = vec4(1.0f, 0.0f, 0.0f, 0.0f);
}
else if(shadow == 1.0f)
{
    vFragColor = vec4(0.0f, 1.0f, 0.0f, 0.0f);
}
else if(shadow < 1.0f && shadow > 0.0f)
{
    vFragColor = vec4(0.0f, 0.0f, 1.0f, 0.0f);
}
else if(shadow < 0.0f)
{
    vFragColor = vec4(1.0f, 0.0f, 1.0f, 0.0f);
}
else if(shadow > 1.0f)
{
    vFragColor = vec4(0.0f, 1.0f, 1.0f, 0.0f);
}
else
{
    vFragColor = vec4(1.0f, 1.0f, 1.0f, 0.0f);
}