我想使用`glDebugMessageCallback'函数来调试我的openGL程序。我已经将调试回调实现为:
void MyDbgCallback(GLenum source, GLenum type, GLenum id, GLenum severity, GLsizei length, const GLchar* msg, GLvoid* user)
{
fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), type, severity, msg);
}
如位于此处的示例所示:https://www.khronos.org/opengl/wiki/Debug_Output另外,在初始化过程中,我包括以下两行:
// Enable debugging output
glEnable(GL_DEBUG_OUTPUT);
glDebugMessageCallback(MyDbgCallback, 0);
现在正在编译(VS2015),我收到以下错误消息:
1>error C2664: 'void (GLDEBUGPROC,const void *)': cannot convert argument 1 from 'overloaded-function' to 'GLDEBUGPROC'
1> note: None of the functions with this name in scope match the target type
[通过搜索网络(包括此站点),我已经看到很多帖子,回调函数中的最后一个参数应该为const GLvoid* user
,并且我都尝试了使用相同错误的两种方法。
在IDE中的红线上方移动,我得到以下消息:“ void()(GLenum souce,GLenum类型,GLenum id,GLenum严重性,GLsizei长度,const GLchar类型]的参数 msg,GLvoid *用户)与GLDEBUGPROC类型的参数不兼容。现在搜索头文件,我发现在GLDEBUGPROC
的第2709行声明了glcorearb.h
,并将其声明为:
typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);
看起来与我使用的DbgCallback函数相同。我想念什么?我需要怎么做才能在Windos 10上使用此功能
函数声明的APIENTRY
部分不是可选的。您的函数未提供此说明符,这可能会迫使编译器对该函数使用C样式的调用约定,而该回调的调用程序将期望该约定。稍后,编译器将尝试使您免于难以调试的错误。
此外,您不应像这样重载回调。一个定义就足够了。