【问题标题】:GL_INVALID_OPERATION error 1218 (0x0502) when using simple OpenGL commands glvertex2i, glColor3ub使用简单的 OpenGL 命令 glvertex2i、glColor3ub 时出现 GL_INVALID_OPERATION 错误 1218 (0x0502)
【发布时间】:2017-09-06 21:55:27
【问题描述】:

这是我第一次使用 OpenGL,所以这可能是一个愚蠢的问题,但我的代码在 glBegin()glEnd() 之间拉出 GL_INVALID_OPERATION 错误(12180x0502)。我只调用了几个简单的命令,但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();

【问题讨论】:

  • 请展示一个最小的、完整的和可验证的例子。你甚至有一个有效的上下文吗?你用哪些参数调用函数?
  • 您使用的是核心上下文吗?其次,当您的函数被调用时,您的 OpenGL 上下文是“当前”上下文吗?
  • @BDL 我调用函数如下:drawShape(GL_LINE, 2, 0, 0, 0, vertex{ 10, 10 }, vertex{ 400, 10 });
  • @Robinson 在上面添加了更多细节
  • 确保你想使用这个古老的 OpenGL api。这是一个死胡同。您应该学习如何编写着色器。最好的教程位于open.gl,并从首页开始。你所做的就像学习如何为 Windows 3.0 编程。

标签: c++ opengl glut freeglut


【解决方案1】:

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

如果要画线,正确的参数是GL_LINES

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

【讨论】:

  • 所以我应该简单地将函数调用的第一个参数更改为GL_LINES?我试过了,得到了同样的错误。
  • 我在拨打drawShape(GL_POLYGON, 4, 0, 50, 200, vertex{ 10, 200 }, vertex{ 110, 200 }, vertex{ 10, 400 }, vertex{ 110, 400 });时也遇到了同样的问题
  • 您应该首先更改此参数,然后确定究竟是哪一行导致了错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多