有时插入条件打印和检查需要很长时间glGetError()
使用二分搜索的形式来缩小范围,其中第一个函数调用是 OpenGL 首先报告错误。
我认为如果有一种方法可以构建一个宏,我可以包装所有可能失败的 GL 调用,并有条件地调用,那就太酷了glGetError
之后立马。当针对特殊目标进行编译时,我可以对其进行检查glGetError
具有非常高的粒度,在编译典型的发布或调试时,这不会被启用(我只会每帧检查一次)。
这样做有意义吗?搜索了一下,我发现一些人建议打电话glGetError
在每次非绘制 gl 调用之后,这基本上与我所描述的相同。
那么在这种情况下,我可以做一些聪明的事情(上下文:我正在使用 GLEW)来简化以这种方式检测我的 gl 调用的过程吗?此时将我的代码转换为将宏包装在每个 OpenGL 函数调用周围将是一项大量的工作。如果我能做一些聪明的事情并让所有这一切顺利进行而无需手动确定要检测的代码部分(尽管这也有潜在的优势......但事实并非如此),那就太好了。really当我调试错误源时不关心性能)。
尝试这个:
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 调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)