Opengl 是";glGenBuffers";如果我们有glBindBuffer真的很重要吗?

Opengl 是";glGenBuffers";如果我们有glBindBuffer真的很重要吗?,opengl,Opengl,我从OpenGl开始,通过阅读关于glBindBuffer的文档,我有点困惑 “glBindBuffer将缓冲区对象绑定到指定的缓冲区绑定点。调用glBindBuffer时,如果将目标设置为可接受的符号常量之一,并将缓冲区设置为缓冲区对象的名称,则会将该缓冲区对象名称绑定到目标。如果不存在名为buffer的缓冲区对象,则会创建一个具有该名称的缓冲区对象。当缓冲区对象绑定到目标时,该目标的先前绑定将自动断开。“ 资料来源: 这是否意味着,如果我不使用“foo”名称创建缓冲区对象,但我调用glBin

我从OpenGl开始,通过阅读关于glBindBuffer的文档,我有点困惑

“glBindBuffer将缓冲区对象绑定到指定的缓冲区绑定点。调用glBindBuffer时,如果将目标设置为可接受的符号常量之一,并将缓冲区设置为缓冲区对象的名称,则会将该缓冲区对象名称绑定到目标。如果不存在名为buffer的缓冲区对象,则会创建一个具有该名称的缓冲区对象。当缓冲区对象绑定到目标时,该目标的先前绑定将自动断开。“ 资料来源:

这是否意味着,如果我不使用“foo”名称创建缓冲区对象,但我调用glBindBuffer,它将使用该名称(“foo”)为我创建一个缓冲区对象

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

GLuint bar = 70;
glBindBuffer(GL_ARRAY_BUFFER, bar);

->创建缓冲区对象,用bar(70)将其“连接”并将其绑定到GL_数组_缓冲区。

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

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

这意味着,
glGenBuffers
除了保留名称(值)之外什么都不做。进一步调用
glGenBuffers
将不会返回相同的值。 如果始终使用
glGenBuffers
获取缓冲区对象的名称值,则可以确保该值尚未用于其他缓冲区对象

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

如果缓冲区不是零或名称,则生成无效的_操作错误 从上一次调用GenBuffers返回,或者如果此后已使用此名称 使用DeleteBuffers删除

规范的这一部分在附录中缺失

这有点混乱,但这是规范

此行为可通过问题的代码验证。以下代码使用兼容配置文件上下文不会返回错误,但使用核心配置文件上下文返回
GL\u INVALID\u OPERATION

GLuint条=70;
glBindBuffer(GL_数组_BUFFER,bar);
GLenum error=glGetError();
第6.1节中的状态说明,
glBindBuffer
必须在缓冲区未指向以前由
glGenBuffers
保留的名称时抛出
GL\u无效\u操作
异常:

如果缓冲区不是零或名称,则生成无效的_操作错误 从上一次对GenBuffers的调用返回,或者如果此后已使用此名称 使用DeleteBuffers删除

同样的信息也在报告中说明


我不知道为什么docs.GL没有声明这些信息。可能是因为我们用错误的方式解释了这个句子,因为它声明缓冲区已经创建。从技术上讲,只有缓冲区名称是通过调用
glGenBuffers
创建的,但是缓冲区对象是在名称第一次绑定时创建的。

e如果不使用
glGenBuffers
,我想您需要自己分配ID?
int-lastBuffer=1;glBindBuffer(GL\u-ARRAY\u-BUFFER,lastBuffer++);
?@rabbi76,所以我需要首先使用
glGenBuffers
创建对象(又称保留对象),然后我可以使用
glBindBuffer
,如果我只是使用“random name“它可能工作,也可能不工作,这取决于该对象是否标记为“未使用”。对吗?(总之:只需使用安全路径:glGenBuffers->glBindBuffer->执行其他操作)@Danijel您可以在应用程序开始时保留一组名称,并在需要ta缓冲区时自行管理它们。您是对的,这是与OpenGL ES的区别。@Rabbi76:有趣的是,我不知道glBindBuffer在ES中的行为不同。但这可能解释了docs.GL声明错误信息的原因。您需要将名称视为黑匣子,不是整数。假设它们是非常复杂的不透明值,所以您希望OpenGL在所有情况下为您生成它们。