[OpenGL]OpenGL简单错误处理

文章目录[x]
  1. 1:完全参考

在OpenGL中,如果不进行处理,一旦报错将会让开发者陷入无尽的抓狂中,因为默认情况下OpenGL能提供的错误信息少之又少,所以需要开发者自己进行错误处理。

首先OpenGL提供了几个能获得详细Debug信息的方法,利用这个方法我们可以获取较为全面的错误信息。但这个方法只能在 4.3以上的版本中使用,所以目前来说,此方法行不通。如下图所示:

 

但是OpenGL还提供了一个 glGetError 可以获取错误信息,此方法返回的一个 int 类型的错误代码,开发者需要根据错误代码去找对应的错误原因,所以依然很不方便,

那怎么办呢?话不多说,直接上代码。

#define ASSERT(x) if (!(x)) __debugbreak();
#define GLCall(x) GLClearError(); \
x;\
ASSERT(GLLogCall(#x, __FILE__, __LINE__))

void GLClearError()
{
    while (glGetError() != GL_NO_ERROR);
}

bool GLLogCall(const char* function, const char* file, int line)
{
    while (GLenum error = glGetError())
    {
        std::cout << "[OpenGL Error](0x" << std::hex << error << ", " << std::dec << error << ") "
            << function << " " << file << ":" << line << std::endl;
        return false;
    }

    return true;
}
#define ASSERT(x) if (!(x)) __debugbreak(); // 其中 __debugbreak(); 会让IDE在执行的位置强行断点,这样当我们调用ASSERT的时候就知道是那一句代码报了错,不过__debugbreak只能在MSVC中使用
ASSERT(GLLogCall(#x, __FILE__, __LINE__)) // 其中 #x表示把x转为字符串, __FILE__, __LINE__ 都是C内置的宏,分别表示当前执行代码语句所在的文件以及行号。

使用

GLCall(//这里写你要调用的OpenGL的API);

 

完全参考


Dealing with Errors in OpenGL

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像