glEnableVertexAttribArray 给出无效操作

Posted

技术标签:

【中文标题】glEnableVertexAttribArray 给出无效操作【英文标题】:glEnableVertexAttribArray gives invalid operation 【发布时间】:2013-02-27 00:43:00 【问题描述】:

我正在尝试阅读 OS X 上的 ArcSynthesis 教程,但在调用 glEnableVertexAttribArray 后出现 OpenGL 错误“无效操作”。根据glEnableClientState and glEnableVertexAttribArray 的讨论,我检查了我确实有一个 VBO 绑定,但我不确定接下来要检查什么。

我使用的是 OS X 10.8、OpenGL 3.2 配置文件和 Xcode 4.6。

我正在尝试编写一个将加载到教程中使用的 XML 模型文件中的类,并且我认为我正在按照与早期程序相同的顺序执行相同的操作绘制一个编码模型。但我一定是在做一些不同或错误的事情,而且不知道是什么。参考 OpenGL 3.2 文档说,通过发送超过 OpenGL 实现允许的最大值的索引值,您会得到一个无效操作,但我使用的是 0 和 1,这是我以前使用过的。

这里是代码,为了清楚起见,所有的 OpenGL 错误检查都被删掉了:

    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
    for (int iAttribLoop = 0; iAttribLoop < [attributeAnalyzers count]; iAttribLoop++) 
        AttributeAnalyzer *theAnalyzer = [attributeAnalyzers objectAtIndex:iAttribLoop];
        GLuint theIndex = [theAnalyzer index];
        NSLog(@"theIndex is %d", theIndex);
        glEnableVertexAttribArray(theIndex);
        glVertexAttribPointer(theIndex, [theAnalyzer size], theType, GL_FALSE, 0, dataOffset);
        dataOffset += sizeof(theType)*[theAnalyzer size]*[theAnalyzer vertexCount];
    

【问题讨论】:

【参考方案1】:

参考 OpenGL 3.2 文档说,您通过发送超过 OpenGL 实现允许的最大值的索引值来获得无效操作

不,它没有。这样做会给你GL_INVALID_VALUEGL_INVALID_OPERATION 仅由 glEnableVertexAttribArray 提供 when you call it and no VAO is bound。

所以你应该这样做。

【讨论】:

这就是我需要的提示!事实证明我被多线程咬住了——在构建 VAO 的方法完成之前,绘图例程正在解除绑定 VAO。绘图程序不需要在这个程序中弄乱 VAO,所以我去掉了那条线并修复了一些东西。看来我得学习线程和 OpenGL 了……谢谢!

以上是关于glEnableVertexAttribArray 给出无效操作的主要内容,如果未能解决你的问题,请参考以下文章

C++学习(三一零)glEnableVertexAttribArray和glVertexAttribPointer的顺序关系

glEnableVertexAttribArray 中“索引”参数的含义和(可能)OS X OpenGL 实现中的错误

了解顶点数组对象(glGenVertexArrays)

如何有效地绘制单点

通过 IBO 了解 VAO

OpenGL - 纹理显示不正确(夹紧?)