如果我们有glBindBuffer,“ glGenBuffers”真的重要吗?

Dan*_*jel 4 opengl

好吧,我从OpenGl开始,通过阅读有关glBindBuffer的文档,我有些困惑。

“ glBindBuffer将缓冲区对象绑定到指定的缓冲区绑定点。在目标设置为可接受的符号常量之一且缓冲区设置为缓冲区对象名称的情况下调用glBindBuffer会将该缓冲区对象名称绑定到目标。如果没有缓冲区对象具有名称缓冲区存在,将使用该名称创建一个缓冲区。将缓冲区对象绑定到目标时,该目标的先前绑定将自动中断。” 来源:http//docs.gl/gl4/glBindBuffer

这是否意味着如果我不创建名称为“ foo”的缓冲区对象,而是调用glBindBuffer,它将为我创建一个名称为“ foo”的缓冲区对象?

如果是这样,以下代码应该可以正常工作:

GLuint bar = 70;
glBindBuffer(GL_ARRAY_BUFFER, bar);
Run Code Online (Sandbox Code Playgroud)

->创建缓冲区对象,将其与条(70)“连接”并将其绑定到GL_ARRAY_BUFFER。

Rab*_*d76 5

不,此代码仅在兼容性配置文件上下文(或OpenGL ES)中有效。

请参阅OpenGL 4.6 API核心配置文件规范-2.6.1对象管理-第28页

[...] GenBuffers命令返回一个或多个以前未使用的缓冲区对象名称。
GL将生成的名称标记为已使用,仅用于生成名称的目的。以这种方式标记的对象名称将不会通过其他调用返回,以生成相同类型的名称,直到通过删除它们再次将它们标记为未使用时为止。

这意味着glGenBuffers does nothing else than reserving names (values). Further calls toglGenBuffers will not return the same values. IfglGenBuffers`始终用于获取缓冲区对象的名称值,然后可以确保该值尚未用于其他缓冲区对象。

但是在桌面OpenGL核心配置文件规范中,不允许使用的名称glBindBuffer,该名称不是由保留(返回)的glGenBuffers

请参阅OpenGL 4.6 API核心配置文件规范-6.1创建和绑定缓冲区对象-页面62

如果buffer不为零或先前调用GenBuffers返回的名称,或者此名称已经用DeleteBuffers删除,则会生成INVALID_OPERATION错误

OpenGL 4.6 API兼容性配置文件规范-6.1创建和绑定缓冲区对象-页面62中缺少此部分规范。

这有点令人困惑,但这就是规范。

此行为可通过您的问题代码验证。以下代码使用兼容性配置文件上下文不返回错误,但GL_INVALID_OPERATION使用核心配置文件上下文返回:

GLuint bar = 70;
glBindBuffer(GL_ARRAY_BUFFER, bar); 
GLenum error = glGetError();
Run Code Online (Sandbox Code Playgroud)