我已经缩小了错误范围,发现问题出在这个OpenGL调用中:
根据此文,唯一可能适用的GL_INVALID_OPERATION条件是绑定缓冲区ID为0。但绑定的缓冲区ID为1。
我使用下面的代码进行错误检查(和打印):
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
根据此文,唯一可能适用的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);
}
GL_INVALID_OPERATION
或GL_OUT_OF_MEMORY
等错误时远非完整。 - Andon M. ColemanglGetString(GL_VERSION)
返回的结果是什么? - Sergey K.GL_ARRAY_BUFFER
缓冲对象...,if条件检查为零。绑定的缓冲区是1(如我所述,在提供的代码中进行检查),因此通过条件。 - Wolfgang Skyler