c++ - 在运行时处理 OpenGL 错误

标签 c++ opengl

假设我正在为 OpenGL 对象编写包装器。在处理异常安全时,我也想考虑 OpenGL 错误(即,当发生错误时,调用 OpenGL 函数的方法返回错误代码或抛出异常)。这样做的目的不是在调试构建期间进行调试,而是在发布构建的运行时处理任何可能的错误。有什么方法可以实现吗?

除了在调试构建中记录日志之外,我不确定是否使用调试输出,同时 glGetError 感觉有点奇怪和不可靠。

最佳答案

Let's say I'm writing a wrapper for an OpenGL object.

第 1 步:不要那样做。我知道这听起来很轻率,但请不要这样。我可以理解想要一个托管对象类型,例如 unique_ptr 但对于 OpenGL 对象。但任何超出此范围的包装几乎肯定对您造成的伤害远大于它的帮助。特别是如果抽象是错误的。 OpenGL 对象和机制之间的交互通常不适合这种事情。

您将从使用 OpenGL 中获得更多 yield direct state access直接调用而不是将 OpenGL 函数包装在某些对象接口(interface)后面。您的代码不会仅仅通过使用成员函数就神奇地变得更好。

when one occurs, a method calling the OpenGL function returns an error code or throws an exception

第 2 步:也不要这样做。大多数 OpenGL 错误是使用错误(即您错误地使用了 API)。使用错误不应作为 C++ 异常处理。异常应该是针对无效输入或具有意外格式的纹理等情况。来自代码之外的东西。使用异常来处理编程错误通常不是一个有用的想法。

如果您需要调试 OpenGL 应用程序,基本上有两种处理方法。对于日常验证,您应该使用 Debug Output记录您收到的任何错误。这对于“发布”类型的构建特别有用(尽管您仍然需要使用 debug context 来确保调试输出支持)。

如果出现错误,您可以加载 Renderdoc 或类似工具,它可以准确告诉您错误产生的位置。或者,您可以设置调试输出,以便它为您提供同步错误消息而不是异步错误,这样您就可以在错误来源的中间设置断点。无论哪种方式,您都应该能够使用最少的专用代码轻松追踪它,最重要的是,没有函数包装器。

事实上,Renderdoc 和类似工具对于跟踪发布版本中的 OpenGL 错误比任何人自己编写的任何工具都更有用。您可以获得所有 OpenGL 调用的踪迹,包括参数值等。这只是处理错误的更好方法。

关于c++ - 在运行时处理 OpenGL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58157717/

相关文章:

c++ - 从cygwin移植到win32 native 程序

python - 使用 boost::python 时将 python.io 对象转换为 std::istream

C++枚举

c++ - 在 Blender 中制作模型并在 opengl 中加载

c++ - 如何使用 OpenGL 渲染在 Qt 界面上显示 IPLImage 流?

C++:将自身结构的地址作为参数传递给 pthread_create 时出错:什么覆盖了我的数据?

c++ - 在 C++ 中使用 `{}` 聚合初始化 union

java - 我的 JOGL 相机旋转而不是左右看

opengl - 使用 DevIL 或 SOIL 保存 openGL 输出

c++ - 如何在 OpenGL 中的地形上添加单个纹理?