[C++] [OpenGL] 对OpenGL进行debug

简介

今天才知道有这么好用的debug函数…

参考

OpenGL Wiki

函数原型

看看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中

可以说是非常强大了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值