OpenGL 有两个“部分”——由 Khronos Group 每隔几个月更新一次的规范,以及由您的显卡制造商专门为您的显卡型号编写的驱动程序。
OpenGL 规范基本上详细说明了 OpenGL API 应该如何工作 - 预期的行为应该是什么,什么时候被认为是意外行为,什么时候抛出哪些错误等。该规范让驱动程序编写者确切地知道他们需要做什么,并且让应用程序编写者知道对驱动程序的期望。这就是 OpenGL 真正“是”的东西——将应用程序和驱动程序结合在一起的粘合剂。您可以在此处阅读每个版本的所有规格。
然后是实现 OpenGL API 并被认为符合规范的驱动程序。驱动程序完全符合您的预期 - 将数据复制到显卡内存或从显卡内存中复制数据,将数据写入显卡寄存器,跟踪状态,处理顶点,编译着色器,指示数百个流处理器同时转换顶点和填充像素等。如果没有 OpenGL,每个显卡模型都会有一个单独的、稍快的 API,由于它的结构方式,它只适用于那个显卡。使用 OpenGL,驱动程序都是针对相同的 API 编写的,应用程序的代码将在所有显卡上运行。
OpenGL 规范的合规性不会随着驱动程序更新而改变。大多数驱动程序更新将修复小错误或进行一些内部优化。
我知道有一次 ATI 驱动程序存在一个小错误,您必须调用glEnable(GL_TEXTURE_2D);
它才能生成 OpenGL 3 方式 ( glGenerateMipMaps()
) 的 mipmap,尽管GL_TEXTURE_2D
已弃用glEnable()
. 我不确定它现在是否已修复,但它肯定是驱动程序编写者很容易忽略的边缘案例类型。
至于优化,有很多需要优化的地方。也许还有另一种在编译着色器时优化着色器的方法,也许有一种更有效的方法可以在流处理器之间分配工作,我不知道。