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

kbi*_*irk 6 opengl floating-point glsl overflow

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

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

编辑:

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

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

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

Len*_*oyt 7

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

float infinity = 1.0 / 0.0;
Run Code Online (Sandbox Code Playgroud)

  • 小心:/sf/ask/730467741/ (3认同)

Tho*_* S. 5

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


ber*_*nie 5

GLSL 使用 IEEE 754 浮点定义float

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

可表示最大浮点值为(1 ? 2^-24) × 2^128

典型的最大浮点值

因此,您可以使用它(取自微软的 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
Run Code Online (Sandbox Code Playgroud)

精确的最大浮点值

此外,由于最大浮点值是

7f7f ffff = 0 11111110 11111111111111111111111 = 2139095039
Run Code Online (Sandbox Code Playgroud)

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

float fMaxFloat = intBitsToFloat(2139095039);
Run Code Online (Sandbox Code Playgroud)