2015-05-05 1 views
2

Я написал минимальное приложение OpenGL и связал консоль с проектом. OpenGL выводит свою версию и тому подобное на консоль.Как перенаправить все результаты OpenGL?

Небольшая рамка OpenGL, которую я пишу, будет использоваться приложением, которое имеет свой собственный журнал, поэтому я хочу перенаправить туда все записи.

До сих пор я пытался решить проблему, но не могу найти всю необходимую мне информацию. Есть debugging tools, но они автономны. Я нашел logging options, но мне непонятно, предназначено ли это для всех сообщений или просто для некоторых.

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

Будет Регистрируясь this function уловом все сообщения или я пропустить некоторые из них. Если да, то как мне записывать все?

+0

Почему вы не попробовали * 'glDebugMessageCallback()' перед тем как задать вопрос? – unwind

+0

@unwind Потому что я не могу доказать отрицательный результат. Если я вижу сообщения - как я знаю, что это все сообщения? – Johannes

+0

Какие сообщения вы говорите? Единственное, о чем я могу думать, это отладочные сообщения (чей API вы уже нашли) или ошибки API через 'glGetError'. –

ответ

2

OpenGL сам по себе не будет выводить какие-либо результаты отладки. glDebugMessageCallback - относительно новая функция с единственной целью предложить канал, через который можно отправлять отладочные сообщения. Но без этого OpenGL не будет выводить вывод отладки.

+0

Я заметил, что часть вывода поступает из промежуточного слоя. Исходный код OpenGL SuperBible, 6-го выпуска также создает собственный вывод. выходы 'application :: run', если они были скомпилированы с '_DEBUG'. – Johannes

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"); 
1

Вопрос, как представляется, - как перенаправить консольные журналы, сгенерированные каркасом OpenGL, на другой уровень. Сам OpenGL не генерирует никаких журналов, и даже обратные вызовы журнала - это только то, что - обратные вызовы к другой функции, зарегистрированной приложением, они не «регистрируют» что-либо на консоли, если это не делает обратный вызов.

Чтобы перенаправить журналы в другой файл или на другой уровень, вы можете обратиться к методам перенаправления оболочки, например, How can I redirect console output to file?.

+0

На самом деле я просто был идиотом :). Сообщения не поступали из OpenGL, а из SuperBible Source. – Johannes

Смежные вопросы