这是基于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
的调用在我的实现中没有任何影响。
有人知道我错过了什么吗?谢谢!
1条答案
按热度按时间wmtdaxz31#
通过
glDebugMessageControl
,您可以明确指定要更改其状态(启用/禁用)的消息。但无法更改所有其他消息的状态,这些消息未在过滤器中指定,过滤器将传递给glDebugMessageControl
。如果要禁用特定调试消息的报告,则
glDebugMessageControl
(enabled
)的最后一个参数必须为GL_FALSE
。此外,
glClear(GL_DEPTH)
将导致GL_INVALID_VALUE
错误,并且源类型为GL_DEBUG_SOURCE_API
,而不是GL_DEBUG_SOURCE_APPLICATION
:如果要禁用除API错误消息之外的所有错误消息,则必须先禁用所有消息,然后显式启用API错误消息:
另请参阅调试输出-消息组件