定义glDebugMessageCallbackARB回调方法

Rak*_*aki 1 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);
Run Code Online (Sandbox Code Playgroud)

但是当添加线

glDebugMessageCallbackARB(&DebugCallback, NULL);
Run Code Online (Sandbox Code Playgroud)

生成以下错误

cannot convert parameter 1 from 'void (__stdcall *)(unsigned int,unsigned int,unsigned int,unsigned int,int,const char *,void *)' to 'GLDEBUGPROCARB'
Run Code Online (Sandbox Code Playgroud)

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

Ret*_*adi 6

官方OpenGL标题:

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

所以最后一个论点需要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);
Run Code Online (Sandbox Code Playgroud)

有没有constuserParam4.3规范文件中,但是const是在4.4和4.5规格加入.从4.4规范中的更改日志:

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