从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上下文中没有绑定缓冲区的用例是什么?重置状态还是这个简单的未定义行为?
请注意,我并没有询问函数本身的作用,任何参数的含义,只是想知道为什么没有错误。
答案 0 :(得分:1)
请参阅here
我做到了。它说:
在以下任何条件下都会生成
INVALID_OPERATION
错误:...
- 指定位置和组织的任何
*Pointer
命令 调用顶点数组数据,而零绑定到ARRAY_BUFFER
缓冲区对象绑定点(参见第2.9.6节),指针参数是 不是NULL
如果您引用附录E中的某些文本,则OpenGL规范的附录不是规范性文本。也就是说,它们实际上并没有定义行为;它们只是为了方便读者而备注。附录E以外行人的语言解释了从核心中删除的内容;实际的规范性文本明确描述了OpenGL核心配置文件的行为。