調試OpenGL程序時 需要在每個gl api調用后使用glGetError檢查狀態(tài)機錯誤
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);//帶返回值調用