过去,许多OpenGL函数确实有一个double变体。glMultMatrix https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMultMatrix.xml例如有f and d变化。其中大部分已经不存在了,但这与float vs. double. glMultMatrixdandglMultMatrixf在核心 GL 3.1 及更高版本中已消失。
In 核心OpenGL http://www.opengl.org/wiki/Core_And_Compatibility_in_Contexts,仍然有一些函数具有double变体。glDepthRange takes double,虽然有一个float版本(主要是为了 GL ES 兼容性而引入)。有一些函数可以don't have double变体,例如glBlendColor.
有时,OpenGL 只是不一致。其他时候,它只是遵循一个合理的原则:不欺骗用户。
Take glBlendColor https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBlendColor.xhtml。如果您可以向其传递双精度值,则意味着浮点混合以双精度精度进行。因为它肯定不会(在任何现有的硬件上),所以提供提供这种准确性的 API 对用户来说是一个默认的谎言。您正在将高精度值进行低精度运算。虽然同样的逻辑也成立glDepthRange(没有双精度深度缓冲区不可用),但它需要doubles。再次,不一致。
The glUniform* https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glUniform.xhtml函数套件是一个更好的例子。他们将状态设置到当前程序对象中。直到GL 4.0,double版本不存在。为什么?因为那是一个谎言。 GLSL 4.0 之前版本不允许您声明double,原因很简单,就是没有 4.0 之前的硬件可以实施它。允许用户创建一个没有意义double如果硬件无法处理。