8

代码核心(显示红色矩形):

//bind program, set uniforms, bind vbo
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0,0);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(0);
//unbind vbo, unbind program

当我将上下文切换到 OpenGL 3.x 时,此代码停止工作(我只能看到背景颜色),但是当我以与上面代码相​​同的方式初始化 VAO 然后我绑定 VAO 并调用 glDrawArrays 时,然后它工作。

可能是什么问题呢?如何在不使用 VAO 的情况下绘制 VBO?

(着色器非常简单,与仅乘矩阵和 ps 输出红色相比)

4

1 回答 1

8

让我们看一下 OpenGL-3-core 规范:

第 2.10 节

第一段:

GL的顶点阶段要使用的缓冲区对象被收集在一起形成一个顶点数组对象。与顶点处理器使用的数据定义相关的所有状态都封装在顶点数组对象中。

最后一段:

如果在将零绑定到 ARRAY BUFFER 缓冲区对象绑定点且指针参数不为 NULL³ 时调用任何指定顶点数组数据的位置和组织的 *Pointer 命令,则会生成 INVALID OPERATION 错误。

在³脚注中:

此错误导致无法创建包含客户端数组指针的顶点数组对象,同时仍允许解除绑定缓冲区对象。

或者换句话说:在 OpenGL-3-core 中你必须使用 VAO

于 2011-06-20T16:18:58.133 回答