【问题标题】:Why does OpenGL use float rather than double? [closed]为什么OpenGL使用float而不是double? [关闭]
【发布时间】:2012-04-04 14:16:51
【问题描述】:

我想知道为什么 OpenGL 在其函数中使用 float 而不是 double。 Double 应该比 float 准确得多。

【问题讨论】:

  • 现有硬件的显着份额仍然根本不支持双精度。现在考虑 OpenGL 已经存在了 20 年......而且,直到 2-3 年前,至少有一家主要的显卡制造商甚至不支持 32 位浮点精度。事实上,没有人注意到其中的区别。
  • 没错,你怎么能注意到差异。连你的银行账户都看不出来,如果它是浮动的,你怎么能用肉眼注意到图片的差异
  • 此外,大多数情况下,当人们想要使用double 而不是float 时,他们在做一些根本错误的事情(例如使用双精度,因为人们想要在行星尺度上渲染)。
  • @EricYin:你银行账户里的钱是一个很好的“做错事”的例子。这不是你会使用float 或double 的东西(尽管假设这是一个常见的初学者错误)。只有定点,没有什么不同。浮点数学原则上无法准确地表示某些数字,或者对它们进行精确的数学运算。虽然您不会注意到您的帐户有 1/1000 美分的错误,但银行会注意到 5000 万客户的情况,或者在一个月内进行 10 亿次交易之后。
  • @EricYin:如果你的银行账户使用浮动,他们的程序员应该被解雇,银行应该为了更大的利益而关闭。浮点数不适合财务计算。你必须在那里使用 bignums。

标签: opengl


【解决方案1】:

过去,许多 OpenGL 函数确实有 double 变体。 glMultMatrix 例如有 f 和 d 变体。其中大多数不再存在,但这与float 与double 无关。 glMultMatrixd 和 glMultMatrixf 在核心 GL 3.1 及更高版本中消失了。

在core OpenGL 中,仍然有具有double 变体的函数。 glDepthRange 采用 double,尽管有一个 float 版本(主要是为了 GL ES 兼容性而引入的)。有些函数没有有double的变体,比如glBlendColor。

有时,OpenGL 只是不一致。其他时候,它只是遵循一个合理的原则:不欺骗用户。

参加glBlendColor。如果您可以将双精度值传递给它,则意味着浮点混合以双精度精度进行。因为它肯定不会(在任何存在的硬件上),所以提供提供这种准确性的 API 对用户来说是一个默认的谎言。您正在将高精度值用于低精度操作。尽管glDepthRange 的逻辑相同(没有双精度深度缓冲区不可用),但它需要doubles。同样,不一致。

glUniform* 函数套件是一个更好的例子。他们将状态设置为当前程序对象。在 GL 4.0 之前,double 版本不存在。为什么?因为那将是一个谎言。 GLSL 4.0 之前的版本不允许您声明 double,原因很简单,因为没有 4.0 之前的硬件可以实现它。如果硬件无法处理,允许用户创建double 是没有意义的。

【讨论】:

  • "glViewport 接受double" - 我猜你的意思是glDepthRange,因为glViewport(GLint, GLint, GLsizei, GLsizei)。
【解决方案2】:

因为大多数时候您不需要精度,而双精度数是两倍。

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多