简介
今天才知道有这么好用的debug函数…
参考
函数原型
看看GLEW对它的定义
#define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback)
额…
GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback;
额…
typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam);
再来看看对GLDEBUGPROC
的定义
typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam);
写的时候GLAPIENTRY
不能漏,它的定义是
# define GLAPIENTRY __stdcall
代码
#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(666, 666, 666);
glutSwapBuffers();
}
void keyboard(unsigned char key, int, int)
{
if (key == 27) exit(EXIT_SUCCESS);
}
void GLAPIENTRY debug(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam)
{
std::cout << std::hex
<< "source:0x" << source << std::endl
<< "type:0x" << type << std::endl
<< "id:0x" << id << std::endl
<< "severity:0x" << severity << std::endl
<< "length:" << length << std::endl
<< "message:" << message << std::endl
<< "userParam:" << userParam << std::endl
<< std::dec;
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE | GLUT_DEBUG);
glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);
glutInitContextVersion(3, 3);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutCreateWindow("");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glewInit();
glDebugMessageCallback(debug, nullptr);
glutMainLoop();
return 0;
}
调试
控制台输出如下:
source:0x8246
type:0x824c
id:0x502
severity:0x9146
length:6e
message:Error has been generated. GL error GL_INVALID_OPERATION in DrawArrays: (ID: 1196158455) There is no VAO bound.
userParam:0
可以看见它甚至帮我们找出了错误原因
There is no VAO bound.
没有绑定顶点数组对象
以及错误的位置
in DrawArrays: (ID: 1196158455)
在glDrawArrays中
可以说是非常强大了。