2014-02-13 128 views
2

我有误差缩小到这个OpenGL的电话:glVertexAttribPointer不可能提升GL_INVALID_OPERATION?

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,可以适用是0绑定缓存ID,但绑定缓存ID为1

我检查的唯一GL_INVALID_OPERATION条件(和印刷)与错误:

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

,有一个检查,以确保var.vertex在绑定的着色器被发现的if语句:

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

您可能拥有核心配置文件上下文,并且没有绑定VAO。这是会导致此错误的“不可能”条件之一。对于诸如“GL_INVALID_OPERATION”或“GL_OUT_OF_MEMORY”之类的错误,手册页远未完成。 –

+0

检查shader_inputs是否正确......并检查你的着色器是否正在编译而没有链接错误 – jpm

+0

@ AndonM.Coleman:我很确定它现在是兼容性上下文。 (OpenGL 3.0)Dang,有一个完整的清单,还是仅仅从经验中学习? @whiteFang:是的,着色器输入正确,着色器编译/链接正确。 'glEnableVertexAttribArray'也被称为。 –

回答

3

您必须在OpenGL 3.1上下文中绑定非零顶点数组对象,而不使用扩展名GL_ARB_compatibility或核心配置文件上下文。这是隐藏的条件,这将产生一个GL_INVALID_OPERATION每当你尝试做相关的顶点数组的任何一个(抽奖,设置顶点指针,

好消息是,这是一个很小的问题修理。

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

+0

我以为glBindBuffer(GL_ARRAY_BUFFER,...)是你所需要的。我想你也需要一个VAO。 –

+0

是的,这改变了OpenGL 3.1。顶点数组对象实际上是存储顶点数组指针的地方,如果你在GL的新版本中没有一个活动,那么就没有地方来存储这个状态。因此,尝试设置状态是无效的操作。在兼容性配置文件中,这不是问题,顶点数组状态仍然作为正常状态机的一部分存在。 –

+0

哇,我花了2h与同样不可能的GL_INVALID_OPERATION,这正是缺少的VAO。谢谢哥们! – fegemo