glGetError无限返回1282

3

以下是我的记录错误的函数:

void check_error(const char* st)
{
    GLenum err(glGetError());

    while (err != GL_NO_ERROR)
    {
        cerr << "OpenGL error: " << err << " "<<st<<endl;
        err = glGetError();
    }
    cerr << "?\n";
}

这被称为:

int _tmain(int argc, char* argv[])
{
    check_error("start");
    ...
}

这段代码在其他地方没有被调用。

它会导致一个无限循环,并产生如下错误:OpenGL error 1282 start

以下是我的包含文件:

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <gl/glew.h>
#include <gl/glut.h>
#include <GL/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

Visual studio 2013


10
如果您没有有效的GL上下文(例如GL窗口),则GL可能会简单地返回GL_INVALID_OPERATION(0x502 = 1282)。 - Brett Hale
那就是问题所在。谢谢! - user2136963
1个回答

4

这并不是直接回答,但考虑到你的评论,我在我的GL库中有一个函数:

GLenum
G0::glFlushError () // noexcept
{
    GLenum ret = glGetError();

    if (ret != GL_NO_ERROR)
    {
        GLuint finite = 255; // (watchdog count)
        GLenum gl_err = ret;

        while (gl_err != GL_NO_ERROR && finite--)
            gl_err = glGetError();

        if (gl_err != GL_NO_ERROR)
            G0::terminate("glGetError: reset failed\n");
    }

    return ret;
}

这里的G0是我的库的命名空间。当你想要测试最近的GL错误并清除它时,glGetError需要在一个循环中调用。这是一个“昂贵”的调用,因为它会暂停管线,因此应该只在“设置”代码或调试期间使用。


出于显而易见的原因,我将库命名空间更改为:GL0 - G0太接近一种Rust尚未征服的语言... - Brett Hale
你可以使用与其他事物类似的名称,不必为每个东西都编造奇怪的名称。 - user253751
@user253751 - 鉴于它的目的,我认为这不那么奇怪。但你做你自己吧,伙计。 - Brett Hale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接