来自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核心配置文件的行为。