glsl无穷大常数

时间:2012-05-03 16:11:14

标签: glsl infinity

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

// GLSL FRAGMENT SHADER
#version 410

<snip>

const float infinity = 1. / 0.;

void main ()
{
    <snip>
}

我知道isinf函数,但我需要为变量指定无穷大,这对我没有帮助。

3 个答案:

答案 0 :(得分:7)

与提到的Nicol类似,没有预定义的常量。

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

例如参见glsl 4.4

  

4.7.1范围和精度

     

...

     

然而,将非零除以0会导致   适当签署的IEEE Infina :如果实现正负零,则正确签名   将生成Inf,否则将生成正Inf。

使用旧版OpenGL时要小心:

例如在glsl 4.0中说:

  

4.1.4花车

     

...

     

同样,对除以0等条件的处理可能会导致结果不明确,但在任何情况下,这种情况都不会导致处理中断或终止。

答案 1 :(得分:5)

没有预先定义的常量,但有isinf函数可以测试某些东西是无穷大。

  

虽然我在这里,但是其他东西有常量吗,比如FLT_MAX FLT_EPSILON等在C中的方式?

不,没有。

答案 2 :(得分:3)

这可能有用吗?

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

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