我想知道为什么OpenGL在其函数中使用float而不是double。 Double应该比float更准确。
答案 0 :(得分:7)
过去,许多OpenGL函数都有double
变体。例如glMultMatrix
有f
和d
个版本。其中大多数不再存在,但这与float
与double
无关。 {GLAL 3.1及以上版本的glMultMatrixd
和 glMultMatrixf
已消失。
在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
是没有意义的。
答案 1 :(得分:1)
因为大多数时候你不需要精度和双倍大小。