c++ OpenGL:glGetError()没有重置其标志?

ax6ht2ek  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(126)

我试着用glGetError()调试代码,但是我发现每次调用它都会抛出错误1282,最后我连续调用了两行glGetError(),两行都给出错误1282。
难道它不应该在第一次调用后重置错误标志,导致第二次调用返回0吗?或者这个函数的工作方式与我想象的不同?

83qze16e

83qze16e1#

泵送it '直至干燥:
为了允许分布式实施,可能存在多个错误标志。如果任何单个错误标志记录了错误,则在调用glGetError时,将返回该标志的值,并将该标志重置为GL_NO_ERROR。如果多个标志记录了错误,则glGetError将返回并清除任意错误标志值。因此,应始终在循环中调用glGetError,直到它返回GL_NO_ERROR。如果所有的错误标志都要被复位。

rqdpfwrv

rqdpfwrv2#

我发现了为什么标记可能没有重置:它只在程序退出时发生,循环变得真正无限。所以原因应该是OpenGL本身,主要是因为库的不同部分的取消初始化是按照我们不知道的顺序进行的。解决方案:泵送直至干燥,或直至计数器达到最大值:

#include <glad/glad.h>

#ifdef _DEBUG
#define GLAD_GET_ERROR_MAX 25
void gladGetError(_In_z_ const char* zFuncName)
{
    GLenum eNumber;
    for (int i = 0; i < GLAD_GET_ERROR_MAX; i++)
    {
        if ((eNumber = glGetError()) == GL_NO_ERROR) break;
        const char* zDescription = NULL;
        switch (eNumber)
        {
            case GL_INVALID_ENUM:
                zDescription = "INVALID ENUM";
                break;
            case GL_INVALID_VALUE:
                zDescription = "INVALID VALUE";
                break;
            case GL_INVALID_OPERATION:
                zDescription = "INVALID OPERATION";
                break;
            case GL_OUT_OF_MEMORY:
                zDescription = "OUT OF MEMORY";
#ifdef GL_VERSION_3_0
                break;
            case GL_INVALID_FRAMEBUFFER_OPERATION:
                zDescription = "INVALID FRAMEBUFFER OPERATION";
#endif // #ifdef GL_VERSION_3_0
            }
            std::cout << "GLAD <" << zFuncName << "> ERROR <" << eNumber << ">: " << zDescription << std::endl;
        }
    }
}

// Macro to trace your code in Debug version
#define GLAD_GET_ERROR(z) gladGetError(z);
#else
#define GLAD_GET_ERROR(z)
#endif // #ifdef _DEBUG

// USAGE!
GLAD_GET_ERROR("Your function name where the error might occur")

相关问题