glVertexAttribPointer引发GL_INVALID_OPERATION不可能?

时间:2014-02-13 23:03:52

标签: opengl

我已将错误缩小到此OpenGL调用:

glVertexAttribPointer(var.vertex, 4, GL_FLOAT, GL_FALSE, 0, 0);

之前没有错误,之后有GL_INVALID_OPERATION错误。 我控制台的输出是:

Error in Shader.cpp : bindMesh : 294
        OpenGL Error: Invalid Operation
        (0x502)
        Bound Buffer: 1
        var.vertex = 1

According to this,唯一可以应用的GL_INVALID_OPERATION条件是绑定缓冲区ID为0.但绑定缓冲区ID为1.

我用以下方法检查(和打印)错误:

printErrors();
int i = 0;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &i);
printf("\tBound Buffer: %i\n", i);
printf("\tvar.vertex = %i\n", var.vertex);

其中printErrors()定义为

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

var.vertex = glGetAttribLocation(programID, "Vertex");

并且检查以确保通过if语句在绑定着色器中找到var.vertex:

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);
}

1 个答案:

答案 0 :(得分:4)

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

好消息是这是一个需要解决的小问题。

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