17

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

// GLSL FRAGMENT SHADER
#version 410

<snip>

const float infinity = 1. / 0.;

void main ()
{
    <snip>
}

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

4

3 回答 3

13

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

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

参见glsl 4.4中的示例:

4.7.1 范围和精度

...

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

但是,当您使用旧版本的 OpenGL 时要小心:

例如在glsl 4.0中它说:

4.1.4 浮点数

...

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

于 2015-11-27T16:36:07.833 回答
6

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

当我在这里时,是否有其他东西的常量,如 FLT_MAX FLT_EPSILON 等,就像 C 中的方式一样?

不是,没有。

于 2012-05-03T17:14:10.113 回答
4

这可能有用吗?

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

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

于 2020-04-17T01:14:21.347 回答