SoftGLRender源码:(工具类)OpenGLUtils
OpenGLUtils类
OpenGLUtils类定义
文件:OpenGLUtils.h
OpenGLUtils类用于OpenGL函数调用的错误检查. 用宏函数方式提供检查OpenGL错误功能:如果出现错误,则自动打印错误log到stderr.
通常,调用OpenGL函数后,会建议调用glGetError()检查错误. OpenGLUtils用宏函数封装了该操作,使得该操作更简便.
class OpenGLUtils {
public:
// 检查OpenGL错误
static void checkGLError_(const char* stmt, const char* file, int line) {
const char* str;
GLenum err = glGetError();
switch (err) {
case GL_NO_ERROR:
str = "GL_NO_ERROR";
break;
case GL_INVALID_ENUM:
str = "GL_INVALID_ENUM";
break;
case GL_INVALID_VALUE:
str = "GL_INVALID_VALUE";
break;
case GL_INVALID_OPERATION:
str = "GL_INVALID_OPERATION";
break;
case GL_OUT_OF_MEMORY:
str = "GL_OUT_OF_MEMORY";
break;
case GL_INVALID_FRAMEBUFFER_OPERATION:
str = "GL_INVALID_FRAMEBUFFER_OPERATION";
break;
default:
str = "(ERROR: Unknown Error Enum)";
break;
}
if (err != GL_NO_ERROR) {
LOGE("GL_CHECK: %s, %s:%d, %s", str, file, line, stmt); // 输出错误log到stderr
abort(); // 终止程序
}
}
};
函数checkGLError_中的枚举值,对应OpenGL常见错误:
GL_NO_ERROR无错误. 正常执行.GL_INVALID_ENUM无效的枚举值. 传入了一个函数不接受的枚举类型值;GL_INVALID_VALUE无效值. 数值参数超出了允许的范围;GL_INVALID_OPERATION无效的操作. 当前状态下不允许执行的操作;GL_OUT_OF_MEMORY内存不足. 无法分配足够的内存.;GL_INVALID_FRAMEBUFFER_OPERATION无效的帧缓操作. 尝试在不完整的帧缓对象(FBO)上渲染;
GL_CHECK
宏函数GL_CHECK通过OpenGLUtils的static函数checkGLError_来实现错误检查、log打印. 这是OpenGLUtils::checkGLError_的便捷使用接口.
#ifdef DEBUG // 只有DEBUG模式下,才生效
#define GL_CHECK(stmt) do {\
stmt; \
OpenGLUtils::checkGLError_(#stmt, __FILE__, __LINE__); \
} while(0)
#else
#define GL_CHECK(stmt) stmt
#endif
注意到用do{...} while(0)包裹了宏后面的内容,这是为了宏函数的安全,因为扩展后,可能会出现一些意想不到的结果.
用户使用
使用GL_CHECK,一行代码实现执行OpenGL代码,同时检查错误.
创建/销毁fbo示例:
GL_CHECK(glGenFramebuffers(1, &fbo_));
...
GL_CHECK(glDeleteFramebuffers(1, &fbo_));

浙公网安备 33010602011771号