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_));
posted @ 2025-05-20 00:36  明明1109  阅读(38)  评论(0)    收藏  举报