浮点RGB值与ubyte RGB值在颜色方面的区别

4

(无符号 char 为 ubyte)

在某些情况下,如颜色类中,使用浮点数值作为 RGB 值的意义何在?它是否提供更高的精度?空间方面呢?使用浮点数与使用 ubyte 相比,性能上有哪些好处/劣势?

2个回答

4

优点:

  • 不需要在进行数学计算时转换为/从浮点数
  • 在连续应用多个处理步骤时,能够更准确地保留中间值
  • 拥有更高的动态范围和分辨率
  • 浮点数是GPU等设备的自然格式

缺点:

  • 需要更多的存储空间

1
不要忘记,当使用浮点格式存储颜色时,您也可以删除伽马校正。您不必即时执行此操作,这样可以避免大量的 powf 调用。 - znkr

3
很可能,它确实提供了更高的精度。正如其他答案中提到的,不必来回转换也有好处,这将导致丢失中间结果——想象一下,你有一个浮点数为1.0(字节中的255)的像素,然后乘以0.65。然后将其转换回整数,那就是166.75,但我们向下舍入到166。所以我们损失了0.75。如果我们进行进一步的计算,误差可能会变大……当然,如果某个中间步骤导致我们的值超过255(1.0)或低于0(0.0),则完全可以保留新值一段时间,然后根据需要稍后“修复”它。
当然,你不能在较小的空间中存储更多的数据(通常情况下),因此典型的浮点数比一个字节大4倍。一些GPU具有16位浮点数,其中包含11位尾数和4-5位指数,这使它们适用于大多数简单像素数学运算。但它仍然是双倍大小,但“精确度”并没有翻倍(我的一个同事花了很多时间尝试使用16位浮点数编写算法,以匹配32位浮点数的结果,但从未完全达到目标)。

那么,你认为在长期使用中,使用浮点数比使用无符号字符(ubytes)真的值得吗? - Master Chief
在英语中,我们有一句话是“绳子有多长”,这基本上意味着“我无法回答”。这完全取决于你正在做什么,你如何做以及你如何定义“更好”或“值得”。更重要的是,存储四倍的数据还是失去一些信息?您是否有一种方法来对您的实现进行基准测试,并比较两个解决方案-为相同的操作集合测量内存使用和执行速度。 - Mats Petersson
非常好的回复!非常感谢您的解释和建议。 - Master Chief

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接