GLSL是否有+/-无穷大或NaN的任何预定义常数?我这样做是一种解决方法,但我想知道是否有一种更清洁的方式:
// GLSL FRAGMENT SHADER
#version 410
<snip>
const float infinity = 1. / 0.;
void main ()
{
<snip>
}
我知道isinf
函数,但我需要为变量指定无穷大,这对我没有帮助。
答案 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中传递了浮点无穷大的编码,则所得浮点值将是对应的(正数或负数)浮点无穷大”