opengl 如何使用glDebugMessageControl

htzpubme  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(159)

这是基于https://www.khronos.org/opengl/wiki/Debug_Output中的调试回调示例,在某种程度上基于https://learnopengl.com/In-Practice/Debugging
设置回叫:

void GLAPIENTRY
MessageCallback( GLenum source,
                 GLenum type,
                 GLuint id,
                 GLenum severity,
                 GLsizei length,
                 const GLchar* message,
                 const void* userParam )
{
  fprintf( stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n",
           ( type == GL_DEBUG_TYPE_ERROR ? "**GL ERROR**" : "" ),
            type, severity, message );
}

然后,在窗口创建等之后,注册它:

glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
glEnable              ( GL_DEBUG_OUTPUT );    

if(glDebugMessageCallback){
    std::cout << "Register OpenGL debug callback " << std::endl;
    glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
    GLuint unusedIds = 0;
    //glDebugMessageCallback( MessageCallback, 0 ); also tried setting up the callback here
    glDebugMessageControl(GL_DONT_CARE,
                          GL_DONT_CARE,
                          GL_DONT_CARE,
                          0,
                          &unusedIds,
                          GL_TRUE);
    glDebugMessageCallback( MessageCallback, 0 );
}
else
    std::cout << "glDebugMessageCallback not available" << std::endl;

之后,我通过调用

glClear(GL_DEPTH);

它的源代码是GL_DEBUG_SOURCE_API。但是,如果我设置

glDebugMessageControl(GL_DEBUG_SOURCE_APPLICATION,
                              GL_DONT_CARE,
                              GL_DONT_CARE,
                              0,
                              &unusedIds,
                              GL_TRUE);

这个回调函数仍然会被发出,尽管据我所知,由于GL_DEBUG_SOURCE_APPLICATION过滤器的原因,它不应该被发出。其他过滤器组合也会出现这种情况,所以我假设对glDebugMessageControl的调用在我的实现中没有任何影响。
有人知道我错过了什么吗?谢谢!

wmtdaxz3

wmtdaxz31#

通过glDebugMessageControl,您可以明确指定要更改其状态(启用/禁用)的消息。但无法更改所有其他消息的状态,这些消息未在过滤器中指定,过滤器将传递给glDebugMessageControl
如果要禁用特定调试消息的报告,则glDebugMessageControlenabled)的最后一个参数必须为GL_FALSE
此外,glClear(GL_DEPTH)将导致GL_INVALID_VALUE错误,并且源类型为GL_DEBUG_SOURCE_API,而不是GL_DEBUG_SOURCE_APPLICATION

glDebugMessageControl(
    GL_DEBUG_SOURCE_API,
    GL_DONT_CARE,
    GL_DONT_CARE,
    0, NULL,
    GL_FALSE); // disable all messages with source `GL_DEBUG_SOURCE_APPLICATION`

如果要禁用除API错误消息之外的所有错误消息,则必须先禁用所有消息,然后显式启用API错误消息:

glDebugMessageControl(
    GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_FALSE);

glDebugMessageControl(
    GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, GL_DONT_CARE, 0, NULL, GL_TRUE);

另请参阅调试输出-消息组件

相关问题