定义glDebugMessageCallbackARB回调方法

时间:2014-10-17 06:50:12

标签: c++ opengl

我使用glew来使用openGL扩展。我正在尝试使用 GL_ARB_debug_output 扩展名。

我在创建上下文时添加了标志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'

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

2 个答案:

答案 0 :(得分: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);

4.3规范文档中const没有userParam,但4.4和4.5规范中添加了const。来自4.4规范中的更改日志:

  

在第20.2节中将const属性添加到DebugMessageCallback和DEBUGPROC的userParam参数。

答案 1 :(得分:1)

我以某种方式发现GLDEBUGPROCARB原型为:

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

因此,您的DebugCallback必须拥有此原型。