【问题标题】:float variable does not compare in any way浮动变量不以任何方式进行比较
【发布时间】:2014-06-03 08:41:12
【问题描述】:

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

为此的编码是: (阴影是浮点数)

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);
}

据我了解,不应在末尾输入“else”,因为之前的代码会检查任何可能的值。 但发生的情况是,对于我得到一些奇怪结果的区域,我想做那种“调试”,代码进入“else”语句。

有人知道这是怎么发生的吗?这个我完全看不懂……

【问题讨论】:

  • 从不比较浮点是否完全相等,而是查看两者之间的距离是否小于某个增量
  • @ratchetfreak 是的,我知道,但是 else if 语句涵盖了小于 0、正好 0、介于 0 和 1 之间、正好 1 和大于 1 的任何内容......所以 delta 与否,如何代码可以进入最后一个else语句吗?
  • 如果 alpha 值为 0,你怎么知道它达到了最新的语句?它是完全透明的。
  • @nurgan:浮点数也可以是“非数字”。
  • @ratchetfreak 有时比较浮点数是否相等是不合适的,有时则不是。如果你决定“从不”来比较它们,你选择了愚昧迷信的道路,这对你来说可能很好,但为什么这对别人来说是正确的选择呢?

标签: opengl floating-point glsl


【解决方案1】:

浮点数也可以是“非数字”

【讨论】:

  • 不要忘记正/负无穷大。此比较中有两个缺失的情况,无穷大和 NaN。您可以在 GLSL 中分别使用 isinf (...)isnan (...) 进行测试。与 NaN 不同,+/- Infinity 将触发其中两种情况,但 GLSL 中没有可用于测试与无穷大相等的无穷大常数,所以我想我会调出函数来检查位模式。
  • @AndonM.Coleman:&lt;&gt; 运算符不应该涵盖无穷大的情况吗?
  • 是的,这就是为什么我说它触发了 2 个案例。但是,如果您想测试无穷大是否相等,则需要自己的特殊情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2012-10-26
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
相关资源
最近更新 更多