问题 glsl无穷大常数


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

// GLSL FRAGMENT SHADER
#version 410

<snip>

const float infinity = 1. / 0.;

void main ()
{
    <snip>
}

我知道了 isinf 功能,但我需要为变量分配无穷大,这对我没有帮助。


2913
2018-05-03 16:11


起源

你需要什么无限? - Shahbaz
使用infinity可以在我的代码中节省大量逻辑: <snip> float t0 = (d >= 0.) ? t : infinity; <snip> float t1 = (d >= 0.) ? t : infinity; t = min (t0, t1); <snip> - atb
我相信选择一个足够大的值(基于你的应用程序)应该很容易做到。比如说 1e20 - Shahbaz
使用无穷大似乎工作正常,我只是想知道是否有一个预定义的常量。虽然我喜欢它,但是有其他东西的常量,比如FLT_MAX FLT_EPSILON等,就像C中那样吗? - atb


答案:


喜欢 尼科尔 提到,没有预定义的常量。

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

参见例如 glsl 4.4

4.7.1范围和精度

...

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

使用旧版OpenGL时要小心:

例如在 glsl 4.0 它说:

4.1.4浮子

...

同样,治疗条件如 除以0可能导致未指定的结果但在任何情况下,这种情况都不应导致处理中断或终止。


6
2017-11-27 16:36





它没有预定义的常量,但有 isinf 用于测试某些东西是否无穷大的功能。

虽然我喜欢它,但是有其他东西的常量,比如FLT_MAX FLT_EPSILON等,就像C中那样吗?

不是,没有。


4
2018-05-03 17:14