使用glDrawArrays绘制VBO在OpenGL 2.1中工作,但在OpenGL 3.x中不工作

chr*_*ris 8 opengl vbo opengl-3

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

//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
Run Code Online (Sandbox Code Playgroud)

当我上下文切换到的OpenGL 3.x的这一代码将停止工作(我可以看到背景的唯一的颜色),但是当我初始化VAO以同样的方式与上面的代码,然后我结合VAO并调用调用glDrawArrays,然后它工作.

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

(着色器非常简单,只有mulitplies矩阵和ps输出红色)

dat*_*olf 7

我们来看看OpenGL-3核心规范:

第2.10节

第一段:

将GL的顶点级使用的缓冲对象收集在一起以形成顶点阵列对象.与顶点处理器使用的数据定义相关的所有状态都封装在顶点数组对象中.

最后一段:

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

在³脚注中:

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

换句话说:在OpenGL-3核心中,您必须使用VAO

  • 您可以在一个VAO中收集多个模型.我通常收集类似属性的网格,这些网格总是在VAO中聚集在一起.例如,可以在一个VAO中收集使用相同着色器的游戏引擎地图的所有静态元素.我会说,通过着色器和材料属性进行排序可能是最好的排序标准. (4认同)