GLSL如何确保最大可能的浮点值而不会溢出

时间:2013-04-17 20:46:22

标签: opengl floating-point overflow glsl

据我所知,GLSL中没有FLT_MAX类型常量。

有没有办法确保float表示没有溢出的最大可能值?

编辑:

因为有人问我使用了什么:

我基本上将一个点扩展为“无限”。它用于2D阴影投射,在那里我完全重塑了GPU上的三角形条带阴影。因为我只能控制一个顶点的处理,w组件存储它是留在船体上还是投射到无穷大。

如果两个“阴影边界”点都是相同的边缘,并且光线几乎与该边缘共线,我需要确保三角形仍然覆盖整个屏幕。很难描述。

3 个答案:

答案 0 :(得分:7)

在GLSL中,通过除以零可以方便地实现IEEE 754无穷大:

float infinity = 1.0 / 0.0;

答案 1 :(得分:3)

GLSL使用float的IEEE 754浮点定义:

  

作为其中一个处理单元的输入值,单精度或双精度浮点变量应与精确和动态范围的相应IEEE 754浮点定义匹配。着色器中的浮点变量也根据IEEE 754规范对单精度浮点值进行编码(逻辑上,不一定是物理上的)。虽然编码在逻辑上是IEEE 754,但操作(加法,乘法等)不一定按照IEEE 754的要求执行。

maximum representable float value是(1 - 2 ^ -24)×2 ^ 128

典型的最大浮点值

因此,你可以使用它(取自Microsoft's float.h

#define FLT_MAX 3.402823466e+38
#define FLT_MIN 1.175494351e-38
#define DBL_MAX 1.7976931348623158e+308
#define DBL_MIN 2.2250738585072014e-308

确切的最大浮点值

此外,由于最大浮点值为

7f7f ffff = 0 11111110 11111111111111111111111 = 2139095039

这是获得确切最大值的另一种有趣方式:

float fMaxFloat = intBitsToFloat(2139095039);

答案 2 :(得分:1)

是的,根据4.1.4中的GLSL language specification,它们是标准的IEEE 754数据类型。我认为缺少FLT_MAX只是因为有不同的长度可用:单精度(浮点),双精度(双精度),有时甚至半精度。 您可以使用正负无穷大,或者如果您需要有限的最大/最小值,则可以使用浮点数中可用的最高数字。如果搜索stackoverflow,很容易找到确切的模式。