(定义一个宏)有助于OpenGL命令调试?

Ste*_* Lu 6 c++ opengl debugging error-handling compiler-errors

有时需要花费很长时间插入条件打印和检查以glGetError()使用二进制搜索的形式缩小范围,其中第一个函数调用是OpenGL首先报告错误.

我认为如果有一种方法可以构建一个宏,我可以将所有GL调用包裹起来,这可能会失败,这将glGetError立即有条件地调用.在编译特殊目标时,我可以glGetError以非常高的粒度进行检查,而在编译典型版本或调试时,这将无法启用(我只检查一帧一次).

这有意义吗?稍微搜索一下,我找到一些人建议glGetError在每次非绘制gl 调用之后调用,这基本上和我描述的一样.

所以在这种情况下,有什么聪明的我可以做(上下文:我正在使用GLEW)来简化这种方式检测我的gl调用的过程?此时转换我的代码以围绕每个OpenGL函数调用包装宏将是一项重要的工作.如果我能做一些聪明的事情并且无需手动确定哪些代码段可以用于仪器(虽然这也具有潜在的优势......但不是真的.我真的不关心性能).当我正在调试错误的来源时).

Mār*_*iko 15

试试这个:

void CheckOpenGLError(const char* stmt, const char* fname, int line)
{
    GLenum err = glGetError();
    if (err != GL_NO_ERROR)
    {
        printf("OpenGL error %08x, at %s:%i - for %s\n", err, fname, line, stmt);
        abort();
    }
}

#ifdef _DEBUG
    #define GL_CHECK(stmt) do { \
            stmt; \
            CheckOpenGLError(#stmt, __FILE__, __LINE__); \
        } while (0)
#else
    #define GL_CHECK(stmt) stmt
#endif
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

GL_CHECK( glBindTexture2D(GL_TEXTURE_2D, id) );
Run Code Online (Sandbox Code Playgroud)

如果OpenGL函数返回变量,那么记得在GL_CHECK之外声明它:

const char* vendor;
GL_CHECK( vendor = glGetString(GL_VENDOR) );
Run Code Online (Sandbox Code Playgroud)

这样,如果定义了_DEBUG预处理程序符号,您将进行调试检查,但在"Release"构建中,您将只具有原始OpenGL调用.