首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glVertexAttribPointer提出了不可能的GL_INVALID_OPERATION?

glVertexAttribPointer提出了不可能的GL_INVALID_OPERATION?
EN

Stack Overflow用户
提问于 2014-02-13 23:03:52
回答 1查看 3.3K关注 0票数 3

我已经将错误缩小到这个OpenGL调用:

代码语言:javascript
复制
glVertexAttribPointer(var.vertex, 4, GL_FLOAT, GL_FALSE, 0, 0);

在它之前没有错误,在它之后也有一个GL_INVALID_OPERATION错误。到我的控制台的输出是:

代码语言:javascript
复制
Error in Shader.cpp : bindMesh : 294
        OpenGL Error: Invalid Operation
        (0x502)
        Bound Buffer: 1
        var.vertex = 1

根据这个,唯一适用的GL_INVALID_OPERATION条件是绑定缓冲区ID为0。但是绑定缓冲区ID为1。

我正在用以下方法检查(并打印)错误:

代码语言:javascript
复制
printErrors();
int i = 0;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &i);
printf("\tBound Buffer: %i\n", i);
printf("\tvar.vertex = %i\n", var.vertex);

其中printErrors()被定义为

代码语言:javascript
复制
void PrintErrors(const char* file, const char* func, int line);
#define printErrors() PrintErrors(__BASE_FILE__,__func__,__LINE__)

void PrintErrors(const char* file, const char* func, int line)
{
    const char* errors[] = {
        "OpenGL Error: Invalid Enumeration\n",
        "OpenGL Error: Invalid Value\n",
        "OpenGL Error: Invalid Operation\n",
        "OpenGL Error: Invalid Frame-Buffer Operation\n",
        "OpenGL Error: Out of Memory\n",
        "OpenGL Error: Stack Underflow\n",
        "OpenGL Error: Stack Overflow\n",
    };

    uint32 i = glGetError();
    while (i != GL_NO_ERROR)
    {
        printf("Error in %s : %s : %i\n\t%s\t(0x%x)\n", file, func, line, errors[i - GL_INVALID_ENUM], i);
        i = glGetError();
    }
}

出什么问题了?

编辑:

发现var.vertex的有:

代码语言:javascript
复制
var.vertex = glGetAttribLocation(programID, "Vertex");

还有一个检查,以确保var.vertex是通过if-语句在绑定着色器中找到的:

代码语言:javascript
复制
if (var.vertex != INVALID_SHADER_VARIABLE) // INVALID_SHADER_VARIABLE = 0xFFFFFFFF (-1 if it where a signed int)
{
    glBindBuffer(...);
    glBuffferData(...);
    glEnableVertexAttribArray(var.vertex);
    glVertexAttribPointer(var.vertex, 4, GL_FLOAT, GL_FALSE, 0, 0);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-14 17:16:29

您必须在OpenGL 3.1上下文中绑定一个非零顶点数组对象,而不需要扩展GL_ARB_compatibility或核心配置文件上下文。这是隐藏的条件之一,每当您尝试执行任何与顶点数组相关的操作(例如绘制、设置顶点指针等)时,都会生成GL_INVALID_OPERATION

好消息是,这是一个微不足道的问题需要解决。

在初始化程序时,您所需要做的至少是生成(glGenVertexArrays (...))和绑定(glBindVertexArray (...))一个顶点数组对象。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21767467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档