【问题标题】:glsl infinity constantglsl 无穷大常数
【发布时间】:2012-05-13 04:43:18
【问题描述】:

GLSL 是否有任何用于 +/-infinity 或 NaN 的预定义常量?我这样做是一种解决方法,但我想知道是否有更清洁的方法:

// GLSL FRAGMENT SHADER
#version 410

<snip>

const float infinity = 1. / 0.;

void main ()
{
    <snip>
}

我知道isinf 函数,但我需要将无穷大分配给一个变量,这样对我没有帮助。

【问题讨论】:

  • 你需要无穷大做什么?
  • 使用无穷大在我的代码中节省了很多逻辑:&lt;snip&gt; float t0 = (d &gt;= 0.) ? t : infinity; &lt;snip&gt; float t1 = (d &gt;= 0.) ? t : infinity; t = min (t0, t1); &lt;snip&gt;
  • 我相信选择一个足够大的值(基于您的应用程序)应该很容易做到这一点。比如说1e20
  • 使用无穷大似乎工作正常,我只是想知道是否有一个预定义的常量。当我在这里时,是否有其他东西的常量,如 FLT_MAX FLT_EPSILON 等,就像 C 中的方式一样?

标签: glsl infinity


【解决方案1】:

就像提到的Nicol 一样,没有预定义的常量。

但是,从 OpenGL 4.1 开始,您的解决方案至少可以保证工作并正确生成无限值。

例如见glsl 4.4:

4.7.1 范围和精度

...

但是,将非零除以 0 会导致 适当签名的 IEEE Inf:如果实现了正零和负零,则正确签名的 将生成 Inf,否则生成正 Inf。

但在使用旧版本的 OpenGL 时要小心:

例如在glsl 4.0 它说:

4.1.4 浮点数

...

类似地,除以 0 等条件的处理可能会导致未指定的结果,但在任何情况下,此类条件都不应导致处理的中断或终止。

【讨论】:

    【解决方案2】:

    它没有预定义的常量,但有isinf 函数来测试某事物是否为无穷大。

    当我这样做的时候,是否有像 FLT_MAX FLT_EPSILON 等 C 语言那样的常量?

    不,没有。

    【讨论】:

      【解决方案3】:

      这可能有用吗?

      const float pos_infinity = uintBitsToFloat(0x7F800000);
      const float neg_infinity = uintBitsToFloat(0xFF800000);
      

      “如果在参数x中传入浮点无穷大的编码,则得到的浮点值就是对应的(正或负)浮点无穷大”

      【讨论】:

        猜你喜欢
        • 2022-08-12
        • 1970-01-01
        • 1970-01-01
        • 2017-06-12
        • 2019-03-19
        • 2013-11-29
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        相关资源
        最近更新 更多