定义glDebugMessageCallbackARB回调方法

Define glDebugMessageCallbackARB callback method

本文关键字:方法 回调 glDebugMessageCallbackARB 定义      更新时间:2023-10-16

Im使用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'

有人能帮我理解这个错误吗?这样我就可以解决了。

来自OpenGL官方标题:

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规范文件中userParam没有const,但在4.4和4.5规范中添加了const。来自4.4规范中的更改日志:

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

我不知怎么发现GLDEBUGPROCARB的原型是:

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

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