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

时间:2018-01-24 23:53:18

标签: opengl opengl-3

从OpenGL 3.3 Core规范,第344页开始,如果调用ARRAY_BUFFER时没有绑定到VertexAttribPointer目标(或者没有绑定VAO),则INVALID_OPERATION发生。请参阅here

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上下文中没有绑定缓冲区的用例是什么?重置状态还是这个简单的未定义行为?

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

1 个答案:

答案 0 :(得分:1)

  

请参阅here

我做到了。它说:

  

在以下任何条件下都会生成INVALID_OPERATION错误:

     

...

     
      
  • 指定位置和组织的任何*Pointer命令   调用顶点数组数据,而零绑定到ARRAY_BUFFER   缓冲区对象绑定点(参见第2.9.6节),指针参数是   不是NULL
  •   

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