【问题标题】:Drawing VBO with glDrawArrays works in OpenGL 2.1 but not in OpenGL 3.x使用 glDrawArrays 绘制 VBO 在 OpenGL 2.1 中有效,但在 OpenGL 3.x 中无效
【发布时间】:2011-06-20 16:00:21
【问题描述】:

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

//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?

(着色器真的很简单,vs 只对矩阵进行乘法运算,然后 ps 输出红色)

【问题讨论】:

    标签: opengl vbo opengl-3


    【解决方案1】:

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

    第 2.10 节

    第一段:

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

    最后一段:

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

    在³脚注中:

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

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

    【讨论】:

    • 我认为 VAO 是可选的。 (我的代码没有抛出任何错误)。那么我应该如何使用 VAO 呢? 1 个 VAO = 1 个模型?
    • 暂时我将使用一个全局 VAO。
    • 您可以在一个 VAO 中收集多个模型。我通常收集具有相似属性的网格,这些网格总是在 VAO 中组合在一起。例如,使用相同着色器的游戏引擎地图的所有静态元素都可以收集在一个 VAO 中。我会说,按着色器和材质属性排序可能是最好的排序标准。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多