Tao*_*hen 3 c++ opengl precision glsl
我正在开发一个项目,从旧版/直接 OpenGL 迁移到现代 OpenGL(核心配置文件)。在遗留的 OpenGL 实现中,我们使用了双精度,即我们使用了GL_DOUBLEinglVertexPointer和我们使用了glLoadMatrixd等等。然而,在现代 OpenGL 中,只有 OpenGL/GLSL 4.0+ 支持双精度。
旧的 OpenGL 如何支持双精度而新的 OpenGL 不支持?传统 OpenGL 如何处理双精度,而大多数显卡甚至不支持双精度?
我在互联网上找不到任何信息或一些答案太旧了。
现在的显卡支持双精度吗?我应该使用 OpenGL 4.0 吗?
旧的 OpenGL 如何支持双精度而新的 OpenGL 不支持?传统 OpenGL 如何处理双精度,而大多数显卡甚至不支持双精度?
它不是你认为的那样。您可以使用双精度作为顶点属性并不意味着(并且从来没有)GL 实现将使用该精度进行计算 - GPU 从未这样做过。在任何情况下,数据都会转换为单精度。矩阵也是如此——在传统 GL 中,发送到 GPU 的矩阵从来都不是双精度的,无论您在指定 CPU 端数据时是否使用d或f后缀。
只是在更新的 GPU 中,着色器内核中可以使用双精度,而现代 GL 4.x 允许您第一次使用它。
另请注意,许多现实世界的消费级 GPU 都有一些疯狂的低双精度比,例如 FP32 性能的 1/32,因此在使用之前最好三思而后行。对于图形,您很少需要它。您之前的代码与遗留 GL 一起工作的事实证明您不需要精度。