我写了一个最小的OpenGL应用程序并将控制台链接到项目。 OpenGL将其版本和类似内容输出到控制台。
我正在编写的小型OpenGL框架将被一个具有自己的日志记录功能的应用程序使用,因此我想将所有日志记录重定向到那里。
到目前为止,我尝试使用Google搜索问题,但我无法找到所需的所有信息。有debugging tools,但这些是独立的。 我发现logging options但是我不清楚这是为了捕获所有消息还是仅仅是一些消息。
void glDebugMessageCallback(DEBUGPROC callback, void* userParam);
注册this function会捕获所有消息,还是会遗漏其中的一些消息。如果是这样,我该如何记录所有内容?
答案 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重定向技术。