如何重定向所有OpenGL输出?

时间:2015-05-05 14:17:13

标签: c++ opengl logging

我写了一个最小的OpenGL应用程序并将控制台链接到项目。 OpenGL将其版本和类似内容输出到控制台。

我正在编写的小型OpenGL框架将被一个具有自己的日志记录功能的应用程序使用,因此我想将所有日志记录重定向到那里。

到目前为止,我尝试使用Google搜索问题,但我无法找到所需的所有信息。有debugging tools,但这些是独立的。 我发现logging options但是我不清楚这是为了捕获所有消息还是仅仅是一些消息。

void glDebugMessageCallback​(DEBUGPROC callback​, void* userParam​);

注册this function会捕获所有消息,还是会遗漏其中的一些消息。如果是这样,我该如何记录所有内容?

3 个答案:

答案 0 :(得分:2)

OpenGL本身不会产生任何调试输出。 glDebugMessageCallback是一个相对较新的功能,其唯一目的是提供一个管道,通过该管道可以发送调试消息。但没有OpenGL就不会产生任何调试输出。

答案 1 :(得分:1)

glDebugMessageCallback在我身边工作得很好。以下代码可能对您有用。请注意,glDebugMessageCallback需要OpenGL> 4.3。

glEnable(GL_DEBUG_OUTPUT);
glDebugMessageCallback([](
    GLenum source, GLenum type, GLuint id,
    GLenum severity, GLsizei length, const GLchar *message, const void *userParam) {

#pragma GCC diagnostic ignored "-Wswitch"
  const char *_source = "Unknown";
  switch (source) {
    case GL_DEBUG_SOURCE_WINDOW_SYSTEM:   _source = "WinSys";         break;
    case GL_DEBUG_SOURCE_APPLICATION:     _source = "App";            break;
    case GL_DEBUG_SOURCE_API:             _source = "OpenGL";         break;
    case GL_DEBUG_SOURCE_SHADER_COMPILER: _source = "ShaderCompiler"; break;
    case GL_DEBUG_SOURCE_THIRD_PARTY:     _source = "3rdParty";       break;
    case GL_DEBUG_SOURCE_OTHER:           _source = "Other";          break;
  }
  const char *_type = "Unknown";
  switch (type) {
    case GL_DEBUG_TYPE_ERROR:               _type = "Error";       break;
    case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: _type = "Deprecated";  break;
    case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:  _type = "Undefined";   break;
    case GL_DEBUG_TYPE_PORTABILITY:         _type = "Portability"; break;
    case GL_DEBUG_TYPE_PERFORMANCE:         _type = "Performance"; break;
    case GL_DEBUG_TYPE_MARKER:              _type = "Marker";      break;
    case GL_DEBUG_TYPE_PUSH_GROUP:          _type = "PushGrp";     break;
    case GL_DEBUG_TYPE_POP_GROUP:           _type = "PopGrp";      break;
    case GL_DEBUG_TYPE_OTHER:               _type = "Other";       break;
  }
  const char *_severity = "Unknown";
  switch (severity) {
    case GL_DEBUG_SEVERITY_HIGH:         _severity = "High";   break;
    case GL_DEBUG_SEVERITY_MEDIUM:       _severity = "Med";    break;
    case GL_DEBUG_SEVERITY_LOW:          _severity = "Low";    break;
    case GL_DEBUG_SEVERITY_NOTIFICATION: _severity = "Notify"; break;
  }
#pragma GCC diagnostic warning "-Wswitch"
  cerr << _source << "." << _type << "[" << _severity << "](" <<
    id << "): " << message << endl;
}, nullptr);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0, 
                     GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Start debugging");

答案 2 :(得分:1)

问题似乎是 - 如何将OpenGL框架生成的控制台日志重定向到另一层。 OpenGL本身不会生成任何日志,甚至日志回调也只是 - 回调到应用程序注册的另一个函数,它们没有&#34; log&#34;除非回调这样做,否则任何东西都会出现在控制台上。

要将日志重定向到另一个文件或其他层,您可以参考How can I redirect console output to file?等shell重定向技术。