如何使用 glDebugMessageControl

How to use glDebugMessageControl

本文关键字:glDebugMessageControl 何使用      更新时间:2023-10-16

这是基于 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 = %sn",
( 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的调用在我的实现中不起作用。

有谁知道我在这里错过了什么? 谢谢!

通过glDebugMessageControl,您可以显式指定要更改其状态(启用/禁用(的消息。但是不可能更改所有其他消息的状态,这些消息未在过滤器中指定,该过滤器将传递给glDebugMessageControl

如果要禁用特定调试消息的报告,则必须GL_FALSEglDebugMessageControl(enabled( 的最后一个参数

。此外,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);

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

相关文章:
  • 没有找到相关文章