有时需要将条件打印和检查的时间长glGetError()
来缩小使用二进制搜索的形式,其中第一个函数调用是一个错误,首先通过OpenGL的报道。
我想如果有是建立我可以包含所有GL调用可能会失败,这将有条件地调用宏的方式它会很酷glGetError
之后。 当编译一个特殊的目标我可以把它检查glGetError
具有非常高的粒度,在编制典型释放或调试,这将不会被启用(我会检查它只有一次帧)。
这是否有意义呢? 搜索这一点我找几个人打电话推荐glGetError
每个非汲取GL-调用这基本上是我所描述的同样的事情后。
因此,在这种情况下,有什么聪明的,我可以做(背景:我使用GLEW),以简化仪器装备我GL调用此方法的过程中? 这将是工作的一个显著量在这一点上转换我的代码环绕每个OpenGL的函数调用的宏。 什么是伟大的是,如果我可以做一些巧妙而得到这一切正在进行中,而无需手动确定哪些是代码的部分仪器(尽管也有潜在的优势......但不是真的。我真的不关心性能的时候我调试错误的来源)。
试试这个:
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调用。