为什么要绑定 OpenGL 缓冲对象?

Why bind OpenGL buffer objects?

在 OpenGL 中,一般过程是绑定命名缓冲区对象(或顶点数组对象、帧缓冲区等),对当前绑定的对象调用一些操作,然后绑定某种 "default" 对象:

glBindBufferObject(GL_ARRAY_BUFFER, bufferObjectName)
glBufferData(GL_ARRAY_BUFFER, data, GL_STATIC_DRAW)
glBindBufferObject(GL_ARRAY_BUFFER, 0)

(Kotlin 中的 LWJGL)

我刚刚发现很多功能都有 "named" 版本。上面的例子会变成

glNamedBufferData(bufferObjectName, data, GL_STATIC_DRAW)

哪个更适合面向对象的上下文。

那么为什么要使用第一个示例中的内容呢?我遇到的每个教程都使用第一种方法,那么 "named" 方法是否存在一些性能损失或类似的缺点?

命名函数是 OpenGL 4.5 中引入的 ARB_direct_state_access 扩展的一部分。在那之前只有普通的方法存在。

使用旧版本的主要原因是针对 OpenGL 4.5 之前的硬件。大多数教程也是针对旧版本的 OpenGL 编写的。