Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ glDebugMessageCallback更详细的信息_C++_Opengl - Fatal编程技术网

C++ glDebugMessageCallback更详细的信息

C++ glDebugMessageCallback更详细的信息,c++,opengl,C++,Opengl,我到处都读到glDebugMessageCallback是获取错误的更好解决方案,所以我实现了它。到现在为止,一直都还不错。我确实得到了更多关于正在发生的事情的详细信息。目前在NVIDIA上,它看起来像这样: 调试日志:在源API中,键入OTHER,id 131185,严重性:无, 消息缓冲区详细信息:缓冲区对象3(绑定到 GL_顶点_属性_数组_缓冲区_绑定_ARB(0),以及 GL\u数组\u缓冲区\u ARB,用法提示为GL\u流\u绘制)将使用视频 内存作为缓冲区对象操作的源 真的很好,

我到处都读到
glDebugMessageCallback
是获取错误的更好解决方案,所以我实现了它。到现在为止,一直都还不错。我确实得到了更多关于正在发生的事情的详细信息。目前在NVIDIA上,它看起来像这样:

调试日志:在源API中,键入OTHER,id 131185,严重性:无, 消息缓冲区详细信息:缓冲区对象3(绑定到 GL_顶点_属性_数组_缓冲区_绑定_ARB(0),以及 GL\u数组\u缓冲区\u ARB,用法提示为GL\u流\u绘制)将使用视频 内存作为缓冲区对象操作的源

真的很好,真的-但是,我错过了一件事-我不能在这里指出这到底发生在哪里

如果我对这样的宏使用旧式方法:

\define CHECK\u GL\u ERROR()checklerror(\uuuu FILE\uuuuuu,\uuuuu LINE\uuuuuuu)
glGetError()

它的详细程度要低得多,代码也很混乱——但是!我可以更容易地跟踪它到底行还是调用它发生了,至少在调试自己时是这样

当然,如果我将日志级别降低到更严格的级别,那么可能也更容易识别源代码,因为所讨论的函数较少,但是,根据代码,我发现查找特定函数有点不精确

所以我现在的问题是-有没有一种方法可以告诉回调到底触发了什么,函数或者代码中的行,就像在旧方法中一样(也就是说,现在没有添加手动断点/调试)

我会发现这非常方便,尤其是考虑到一种情况,即可能只是在使用该软件的人只能为我无法重现的问题提供日志


PS:有人能告诉我“id”是什么意思吗?我找到了很多教程和解释,也阅读了文档,但我仍然不知道它在调试中有什么用途。

有两种方法可以帮助您确定错误的来源:

首先,您可以
glEnable(GL\u DEBUG\u OUTPUT\u SYNCHRONOUS)
,以确保在产生错误的函数范围内抛出错误。现在,当您在错误回调函数中设置断点时,您将看到错误发生的调用堆栈


第二:OpenGL允许您将名称和范围与每个OpenGL对象相关联。这允许您指定缓冲区的名称。查看更多细节。

我会考虑使用OpenGL调试器进行调试。调试回调可以提供提示,但您确实需要找到是哪部分代码触发了它。还有一些调用跟踪程序,可以记录您对OpenGL的每次调用,以便以后进行检查。总的来说,我会尽我所能。仅仅因为你使用调试回调并不意味着你不能使用glGetError,反之亦然。我并不反对,但如果我自己不能调试它,并且只能从用户f.e.那里获取报告,我希望拥有最有用和信息最丰富的日志。除此之外,这仍然会使事情变得更容易:)嗨,你成功地获得了“行”吗也可以使用
glDebugMessageCallback
打印?是的,我知道,但目前我想看看如何最大限度地利用“无人参与”日志记录。如果您真的想在日志记录期间知道自己在哪里,您可以自己生成一个stacktrace(取决于编译器的工作方式)。