GL_INVALID_OPERATION 使用简单的 OpenGL 命令 glvertex2i、glColor3ub 时出现错误 1218 (0x0502)
GL_INVALID_OPERATION error 1218 (0x0502) when using simple OpenGL commands glvertex2i, glColor3ub
这是我第一次使用 OpenGL,所以这可能是个愚蠢的问题,但我的代码在 [=17] 之间出现 GL_INVALID_OPERATION
错误(1218
或 0x0502
) =] 和 glEnd()
。我只调用了几个简单的命令,但在此函数的开头调用 glGetError()
returns 0
,最后调用 1218
。
此函数旨在用于绘制任何简单形状的单个实例,在调试器中单步执行后,变量就是我想要的。另请注意,尽管这是一个愚蠢的问题,但我昨晚和今天花了几个小时搜索 Google 和我的教科书寻找可能的解决方案,但由于 OpenGL 错误的模糊性质,我没有找到任何有用的东西。
void drawShape(GLenum type, int numPoints, GLubyte r, GLubyte g, GLubyte b, vertex vertices, ...) {
glBegin(type);
glColor3ub(r, g, b);
// iterate through vertices
va_list vertexList;
va_start(vertexList, vertices); // use vertexList for iteration
for (int i = 0; i < numPoints; ++i) {
vertex point = i == 0 ? vertices : va_arg(vertexList, vertex);
// add a new point at (x, y)
glVertex2i(std::get<0>(point), std::get<1>(point));
}
glEnd();
}
这个函数调用如下:
drawShape(GL_LINE, 2, 0, 0, 0, vertex{ 10, 10 }, vertex{ 400, 10 });
我使用的上下文是 FreeGLUT,初始化如下:
// gross workaround for calling init with no arguments
int argc = 1;
char *argv[1] = { (char*)"" };
glutInitContextVersion(4, 1);
glutInit(&argc, argv);
// RGB window, double buffer
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
// sets values necessary for window initialization
glutInitWindowPosition(INIT_X, INIT_Y);
glutInitWindowSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// draw the window and create the scene
glutCreateWindow(WORKING_WINDOW_TITLE);
glClearColor(1, 1, 1, 1); // set clear color to white
glutDisplayFunc(render);
glutMainLoop();
问题在于对glBegin
本身的调用。 GL_LINE
不是此函数的有效参数。因此,之后的所有命令都不会在有效的 glBegin/glEnd
块内调用。
如果要画线,正确的参数是GL_LINES
。
调试不支持调试上下文的 OpenGL 应用程序时,第一步应该始终是确定哪个函数调用产生了第一个错误。例如,这可以通过在每次 OpenGL 调用之后调用 glGetError()
来完成,直到找到有问题的行。另请注意,如果发生不止一个错误,则 glError
returns 错误顺序为任意顺序。
这是我第一次使用 OpenGL,所以这可能是个愚蠢的问题,但我的代码在 [=17] 之间出现 GL_INVALID_OPERATION
错误(1218
或 0x0502
) =] 和 glEnd()
。我只调用了几个简单的命令,但在此函数的开头调用 glGetError()
returns 0
,最后调用 1218
。
此函数旨在用于绘制任何简单形状的单个实例,在调试器中单步执行后,变量就是我想要的。另请注意,尽管这是一个愚蠢的问题,但我昨晚和今天花了几个小时搜索 Google 和我的教科书寻找可能的解决方案,但由于 OpenGL 错误的模糊性质,我没有找到任何有用的东西。
void drawShape(GLenum type, int numPoints, GLubyte r, GLubyte g, GLubyte b, vertex vertices, ...) {
glBegin(type);
glColor3ub(r, g, b);
// iterate through vertices
va_list vertexList;
va_start(vertexList, vertices); // use vertexList for iteration
for (int i = 0; i < numPoints; ++i) {
vertex point = i == 0 ? vertices : va_arg(vertexList, vertex);
// add a new point at (x, y)
glVertex2i(std::get<0>(point), std::get<1>(point));
}
glEnd();
}
这个函数调用如下:
drawShape(GL_LINE, 2, 0, 0, 0, vertex{ 10, 10 }, vertex{ 400, 10 });
我使用的上下文是 FreeGLUT,初始化如下:
// gross workaround for calling init with no arguments
int argc = 1;
char *argv[1] = { (char*)"" };
glutInitContextVersion(4, 1);
glutInit(&argc, argv);
// RGB window, double buffer
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
// sets values necessary for window initialization
glutInitWindowPosition(INIT_X, INIT_Y);
glutInitWindowSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// draw the window and create the scene
glutCreateWindow(WORKING_WINDOW_TITLE);
glClearColor(1, 1, 1, 1); // set clear color to white
glutDisplayFunc(render);
glutMainLoop();
问题在于对glBegin
本身的调用。 GL_LINE
不是此函数的有效参数。因此,之后的所有命令都不会在有效的 glBegin/glEnd
块内调用。
如果要画线,正确的参数是GL_LINES
。
调试不支持调试上下文的 OpenGL 应用程序时,第一步应该始终是确定哪个函数调用产生了第一个错误。例如,这可以通过在每次 OpenGL 调用之后调用 glGetError()
来完成,直到找到有问题的行。另请注意,如果发生不止一个错误,则 glError
returns 错误顺序为任意顺序。