【问题标题】:GLSL How to ensure largest possible float value without overflowGLSL如何确保最大可能的浮点值而不会溢出
【发布时间】:2023-04-07 02:40:01
【问题描述】:

据我了解,GLSL 中没有 FLT_MAX 类型的常量。

有什么方法可以保证一个浮点数代表最大可能值而不会溢出?

编辑:

既然有人问我用这个做什么:

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

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

【问题讨论】:

  • 您是否特别想对这些尺寸不寻常的花车进行任何处理?

标签: opengl floating-point overflow glsl


【解决方案1】:

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

float infinity = 1.0 / 0.0;
【解决方案2】:

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);

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-22
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多