为什么 VertexAttribPointer 不抛出没有 VBO 绑定的INVALID_OPERATION



来自OpenGL 3.3 Core规范,第344页,它说,如果在调用VertexAttribPointer时没有绑定到ARRAY_BUFFER目标(或没有绑定VAO(,则会发生INVALID_OPERATION。看这里。

glBindBuffer(GL_ARRAY_BUFFER, 0);
glVertexAttribPointer(index, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (void *) 0);
// or doing
glVertexAttribPointer(index, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), NULL);

我刚刚尝试了这个,没有发生INVALID_OPERATION,它似乎只是忽略了该语句。

这是司机问题还是我的误解?

如果这是有意为之,那么在调用此函数时在 OpenGL Core 上下文中没有缓冲区绑定的用例是什么?重置状态还是这只是未定义的行为?

请注意,我不是在问函数本身的作用,任何参数的用途,只是想知道为什么没有错误。

看这里

我做了。它说:

在以下任一情况下,将生成INVALID_OPERATION错误:

  • 指定位置和组织的任何*Pointer命令 调用顶点数组数据,同时将零绑定到ARRAY_BUFFER 缓冲区对象绑定点(请参阅第 2.9.6 节(,指针参数为 不NULL

如果您引用附录 E 中的某些文本,则 OpenGL 规范的附录不是规范性文本。也就是说,它们实际上并没有定义行为;它们只是方便读者的注释。附录E用通俗的语言解释了从核心中删除的内容;实际的规范文本明确描述了OpenGL核心配置文件的行为。

最新更新