Pek*_*kka 3 c++ opengl visual-c++ glload
我使用ARB_DEBUG_OUTPUT扩展来捕获OpenGL错误,但程序在调用我的错误记录功能后崩溃.
我使用此博客文章中的代码设置了扩展程序.这是我用来设置回调的确切代码:
glDebugMessageCallback((GLDEBUGPROC)debugCallbackARB, stderr);
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
Run Code Online (Sandbox Code Playgroud)
这里的 debugCallbackARB
void debugCallbackARB(GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar *message, GLvoid *userParam)
{
(void)length;
FILE *outFile = (FILE*)userParam;
char finalMessage[256];
formatDebugOutputARB(finalMessage, 256, source, type, id, severity, message);
logger->debug("%s", finalMessage);
}
Run Code Online (Sandbox Code Playgroud)
我使用glEnable无效参数来触发回调:
glEnable(GL_DEPTH);
Run Code Online (Sandbox Code Playgroud)
成功打印错误消息后,程序会触发未处理的异常 Access violation executing location 0x00000500.
我使用SDL2创建OpenGL 3.3核心配置文件调试上下文和GL Load来获取GL扩展指针.
glEnable如果禁用扩展,程序不会因无效调用而崩溃.
我怎样才能解决这个问题?
电脑规格:
编辑:我也尝试手动调用调试回调,但它不会触发异常.
OpenGL回调函数使用__stdcall调用约定,而不是__cdecl在MSVC2012中默认启用.
我将回调定义更改为
void CALLBACK debugCallbackARB(GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar *message, GLvoid *userParam)
Run Code Online (Sandbox Code Playgroud)
使用CALLBACKWindows API标头定义的宏.
无效地址0x00000500是十进制的1280,它恰好是一个屏幕宽度参数,传入调用层次结构中高一级的初始化函数.由于调用约定无效,因此从堆栈中读取此值,而不是调用函数的图形驱动程序设置的实际返回地址.
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |