为什么要绑定 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 编写的。
在 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 编写的。