2014-10-17 52 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這個原型的。