使用简单的OpenGL命令时GL_INVALID_OPERATION错误1218(0x0502)glvertex2i,glColor3ub

时间:2017-09-06 21:55:28

标签: c++ opengl glut freeglut

这是我第一次使用OpenGL,所以这可能是一个愚蠢的问题,但我的代码在GL_INVALID_OPERATION之间引发1218错误(0x0502glBegin())和glEnd()。我只调用了几个简单的命令,但glGetError()在此函数开头返回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();

1 个答案:

答案 0 :(得分:2)

问题在于对glBegin本身的呼唤。 GL_LINE不是此函数的有效参数。因此,之后的所有命令都不会在有效的glBegin/glEnd块内调用。

如果要绘制线条,则正确的参数为GL_LINES

调试不支持调试上下文的OpenGL应用程序时,第一步应始终是识别哪个函数调用产生第一个错误。例如,这可以通过在每次OpenGL调用之后调用glGetError()来完成,直到找到有问题的行。另请注意,如果发生多个错误,glError将以任意顺序返回错误。