OpenGL浮点精度

5
我正在从传统/立即OpenGL迁移到现代OpenGL (核心配置文件)的项目中工作。在旧版OpenGL实现中,我们使用双精度,即在glVertexPointer中使用GL_DOUBLE,使用glLoadMatrixd等。但是,在现代OpenGL中,只有OpenGL/GLSL 4.0+支持双精度。
为什么旧版OpenGL支持双精度而更新的OpenGL不支持呢?大多数图形卡都不支持双精度,传统OpenGL如何处理双精度?
我在网上找不到任何信息,或者一些答案太旧了。
目前的图形卡是否支持双精度?我应该使用OpenGL 4.0吗?

如果在几乎所有情况下GL_DOUBLE没有与C++的double相等,我会感到非常惊讶。 - Jesper Juhl
我不确定,但我认为旧的图形卡默认使用半浮点。GL_DOUBLE则意味着常规浮点。但这只是我的猜测。图形卡支持double,但它们往往拥有较少的核心可以执行双精度计算,使其几乎无法用于性能会受到巨大打击。 - ALX23z
@JesperJuhl GL_DOUBLE 应该等同于 c++ 的 double,因为传统的 OpenGL 使用 C++ 的 double。然而,现代 OpenGL(不包括 OpenGL 4.0+)没有针对 double 的 API,即 glUniform 不接受 double,你也不能在着色器中定义 double。 - Tao Chen
1个回答

9
旧版OpenGL如何支持双精度,而新版OpenGL不支持?传统的OpenGL如何处理双精度,而大多数图形卡甚至不支持双精度?
实际上,你认为的不是那样的。可以将double作为顶点属性使用,并不意味着(也从未意味着)GL实现将以该精度进行计算 - GPU从未这样做过。在任何情况下,数据都会转换为单精度。矩阵也是如此 - 发送到GPU的矩阵在旧版GL中从未是双精度,无论您在指定CPU端数据时使用d还是f后缀。
只是随着更近代的GPU,双精度变得可用于着色器核心,并且现代GL 4.x允许您第一次使用它。
同时请注意,许多真实世界的消费级GPU有一些疯狂低的双精度比率,例如FP32性能的1/32,因此最好三思而后行。对于图形,很少需要此功能。您以前的代码与旧版GL一起工作的事实证明您不需要这种精度。

谢谢您的回答!所以,即使我在使用glm :: dvec3顶点调用glVertexPointer,图形卡内部仍然使用单精度吗? - Tao Chen
是的!你需要GL4.X版本以及glVertexAttribLPointer函数(注意函数名中的L,表示“双精度”)。 - derhass
@TaoChen:“即使我使用glm::dvec3顶点调用glVertexPointer,图形卡内部仍然使用单精度吗?” 不仅如此。如果您尝试这样做,系统基本上必须在CPU上读取顶点数据并将双精度转换为浮点数,因为硬件实际上无法读取它们。这样做会降低性能。 - Nicol Bolas
1
“对于图形,你很少需要它。” 实际上,你最明显会使用它的地方(在VS中的位置)实际上并没有帮助,因为gl_Position是一个单精度向量。即使不是这样,消耗它的硬件肯定无法处理双精度值。深度缓冲区也不能。 - Nicol Bolas

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