(定义宏)促进的OpenGL命令调试?((Define a macro to) facilitate

2019-07-30 03:45发布

有时需要将条件打印和检查的时间长glGetError()来缩小使用二进制搜索的形式,其中第一个函数调用是一个错误,首先通过OpenGL的报道。

我想如果有是建立我可以包含所有GL调用可能会失败,这将有条件地调用宏的方式它会很酷glGetError之后。 当编译一个特殊的目标我可以把它检查glGetError具有非常高的粒度,在编制典型释放或调试,这将不会被启用(我会检查它只有一次帧)。

这是否有意义呢? 搜索这一点我找几个人打电话推荐glGetError每个非汲取GL-调用这基本上是我所描述的同样的事情后。

因此,在这种情况下,有什么聪明的,我可以做(背景:我使用GLEW),以简化仪器装备我GL调用此方法的过程中? 这将是工作的一个显著量在这一点上转换我的代码环绕每个OpenGL的函数调用的宏。 什么是伟大的是,如果我可以做一些巧妙而得到这一切正在进行中,而无需手动确定哪些是代码的部分仪器(尽管也有潜在的优势......但不是真的。我真的不关心性能的时候我调试错误的来源)。

Answer 1:

试试这个:

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预处理器符号定义,但在“释放”打造你刚才的原始OpenGL调用。



Answer 2:

BuGLe听起来像它会做你想要什么:

  • 转储的所有GL呼叫的文本记录。
  • 采取截图或拍摄视频。
  • 呼叫glGetError在每次通话后检查错误,并包裹glGetError使这个检查是透明的程序。
  • 捕获和显示统计数据(如帧速率)
  • 强制线框模式
  • 恢复从分段错误回溯驱动器内部,即使驾驶员没有符号编译。


文章来源: (Define a macro to) facilitate OpenGL command debugging?