我使用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'
任何人都可以帮助我理解这个错误,以便我可以解决。
答案 0 :(得分:6)
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
必须拥有此原型。