OpenGL:GL_R11F_G11F_B10F 的精度适用于 8 位 RGB 图像吗?

OpenGL: Is the precision of GL_R11F_G11F_B10F good for 8bit RGB images?

"Image Format",我们看到:

An 11-bit float has no sign-bit; it has 6 bits of mantissa and 5 bits of exponent.

从“Half-precision floating-point format”,我们可以推导出: 11位浮点数的相对精度为2^(-6),即1/64

但对于 8 位 RGB 图像,255 的相对精度为 (255-254)/255 = 1/255。

那是不是说GL_R11F_G11F_B10F的精度对于8bit RGB图像在较大的亮度范围(例如255)下不好?

使用浮点图像的原因是允许您表达 [0, 1] 范围之外的值。如果那是您需要做的,那么这就是您需要做的,规范化整数格式将无济于事,无论其精度如何。

这种特殊的浮点格式在不使用共享指数的情况下尽可能压缩浮点 RGB 数据。相对于规范化的 8 位整数,它确实失去了精度,只有大约 2.1 位小数精度(由于 IEEE-754 浮点数的工作方式,你得到的尾数比实际多一位的效果)。

但如前所述,如果您需要大于 1 的值,则无法选择标准化格式。这种特殊的浮点格式适用于精度损失可以容忍的情况。这将用于 HDR 情况下的帧缓冲区输出等用途。它的大小是 16 位浮点 RGBA 格式的一半,因此可以代表帧缓冲区带宽成本的重要性能改进。

这是一个优化。您可能会使用半浮点数进行开发,但随后切换到这个并查看是否可以分辨出差异。如果不是,您将永久切换到它(可能使用面向用户的设置以获得更高的图像保真度)。