调试OpenGL程序时 需要在每个gl api调用后使用glGetError检查状态机错误
GLuint tex;
glGenTextures(1, &tex);
if (glGetError()) {
LOGE("gl err : file %s line %d errno %d", __FILE__, __LINE__, glGetError());
abort();
}
编码时每个调用后都加入这样一段代码会让代码变得繁琐
可以封装glGenTextures
void CX_glGenTextures(GLsizei n, GLuint* textures) {
glGenTextures(n, textures);
if (glGetError()) {
LOGE("gl err : file %s line %d errno %d", __FILE__, __LINE__, glGetError());
abort();
}
}
}
这么做的缺点在于要把所有的gl api都封装一次 太过繁琐
针对这种情况,可以用模板来实现
template <typename Fun, typename... Args>
void GLExecWithoutRetVal(Fun *fun, Args... args) {
(*fun)(args...);
if (glGetError()) {
LOGE("gl err : file %s line %d errno %d", __FILE__, __LINE__, glGetError());
abort();
}
}
template <typename Fun, typename Ret, typename... Args>
void GLExecWithRetVal(Fun *fun, Ret *ret, Args... args) {
*ret = (*fun)(args...);
if (glGetError()) {
LOGE("gl err : file %s line %d errno %d", __FILE__, __LINE__, glGetError());
abort();
}
}
调用 :
GLuint tex;
GLExecWithoutRetVal(&glGenTextures, 1, &tex);//无返回值调用
GLuint program;
GLExecWithRetVal(&glCreateProgram, &program);//带返回值调用