2014-10-17 119 views
1

使用glew来使用openGL扩展。我正在尝试使用GL_ARB_debug_output扩展名。定义glDebugMessageCallbackARB回调方法

我在创建上下文的同时添加了标志WGL_CONTEXT_DEBUG_BIT_ARB,因此使用调试支持创建了上下文。

虽然试图定义glDebugMessageCallbackARB回调方法我发现下面的函数从博客

void CALLBACK DebugCallback(unsigned int source, unsigned int type, 
          unsigned int id, unsigned int severity, 
          int length, const char* message, void* userParam); 

但是当添加行

glDebugMessageCallbackARB(&DebugCallback, NULL); 

生成以下错误

cannot convert parameter 1 from 'void (__stdcall *)(unsigned int,unsigned int,unsigned int,unsigned int,int,const char *,void *)' to 'GLDEBUGPROCARB' 

任何一个帮助我理解这个错误,以便我可以解决。

回答

6

official OpenGL header

typedef void (APIENTRY *GLDEBUGPROCARB)(
    GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, 
    const GLchar *message, const void *userParam); 

所以最后一个参数必须是const void*代替void*你尝试。其他参数可能也可以,这取决于您的平台上GL类型的定义。但在函数声明中使用GL类型会更安全。

请注意,在OpenGL 4.3中添加了这个核心版本。如果您有4.3可用,您可以使用glDebugMessageCallback()而不是glDebugMessageCallbackARB()。相应的回调声明看起来在标题一样:

typedef void (APIENTRY *GLDEBUGPROC)(
    GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, 
    const GLchar *message, const void *userParam); 

有没有const为4.3规范文档中userParam,但在4.4和4.5规范中加入const。从4.4规范中的更改日志:

将常量属性添加到DebugMessageCallback的userParam参数和20.2节中的DEBUGPROC。

1

不知何故,我发现,GLDEBUGPROCARB的原型为:

typedef GLvoid (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, 
    GLuint id, GLenum severity, GLsizei length, 
    const GLchar* message, GLvoid* userParam); 

也因此,你必须DebugCallback这个原型的。