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

时间:2012-06-29 05:26:14

标签: c++ debugging opengl error-handling compiler-errors

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

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

这样做有意义吗?稍微搜索一下,我发现有几个人建议在每次非绘制gl调用之后调用glGetError,这与我所描述的基本相同。

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

2 个答案:

答案 0 :(得分:13)

试试这个:

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

像这样使用:

GL_CHECK( glBindTexture2D(GL_TEXTURE_2D, id) );

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

const char* vendor;
GL_CHECK( vendor = glGetString(GL_VENDOR) );

这样,如果定义了_DEBUG预处理程序符号,您将进行调试检查,但在“Release”构建中,您只需要原始的OpenGL调用。

答案 1 :(得分:1)

BuGLe听起来会像你想要的那样:

  • 转储所有GL通话的文本日志。
  • 截取屏幕截图或拍摄视频。
  • 每次调用后调用glGetError以检查错误,并包装glGetError以使此检查对您的程序透明。
  • 捕获并显示统计信息(例如帧速率)
  • 强制使用线框模式
  • 从驱动程序内部的分段错误中恢复回溯,即使驱动程序是在没有符号的情况下编译的。